Урок 15. Создаем контекстное меню для экранных компонентов в андроид приложениях (Android Studio)

Поділитися
Вставка
  • Опубліковано 16 жов 2024
  • Простой пример контекстного меню (ContextMenu) для View элементов экрана андроид приложения. Будем вызывать для TextView контекстное меню со списком пунктов, по нажатию на которые будем динамически менять цвет и размер шрифта в TextView.
    Весь плейлист: • Уроки по основам разра...
    Ссылки и исходный код на странице урока: www.fandroid.in...
    #android #AndroidStudio #startandroid

КОМЕНТАРІ • 66

  • @Yuriy-b9h
    @Yuriy-b9h 9 років тому +10

    Большое спасибо за уроки! Очень нравятся. Все доходчиво и сделано качественно и видно с душой. Надеюсь вы это дело не забросите, как это иногда бывает. Аналогичных уроков такого уровня больше не нашел. Спасибо!

  • @MANUFAKTORYJORNAL
    @MANUFAKTORYJORNAL 9 років тому +7

    Только позовчера написал как бы хотелось видеть больше роликов под Android studio и вуаля. Спасибо огромное!!!
    Продалжайте в том-же духе и храни вас бог.

  • @alexeygorshkov4501
    @alexeygorshkov4501 9 років тому +6

    По поводу ДЗ) Из xml загружать меню очень удобно и просто! Создаем в ресурсах 2 меню для цвета и размера шрифта, там указываем понятные ид.
    В onCreateContextMenu используем вместо menu.add(...) команду загрузки элементов меню из ресурсов getMenuInflater().inflate(R.menu.menu_tvcolor, menu);
    Спасибо за видеоурок!

    • @Green7497
      @Green7497 9 років тому +2

      Алексей Горшков можно и один файл меню, разбив элементы на группы и добавив в обработку создания команды
      menu.setGroupVisible(R.id.colorMenuGroup, false);
      menu.setGroupVisible(R.id.sizeMenuGroup, true);и наоборот для второго TextView

    • @609Spider
      @609Spider 7 років тому

      Не понял какие два меню и где надо создавать? В левой части столбца, под activity_main?

  • @StrangerFromKherson
    @StrangerFromKherson 7 років тому +17

    Подробное описание по выполнению ДЗ на AS 2.3.1:
    1. Слева над деревом проекта переключитесь с режима просмотра Android в режим Project
    2. В каталоге app\src\main
    es создайте каталог menu
    3. В каталоге menu создайте 2 файла со следующим содержимым:
    3.1 context_menu_colors.xml

    3.2 context_menu_size.xml

    4. В MainActivity.java вносим следующие изменения
    4.1
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    switch (v.getId()) {
    case R.id.tvColor:
    getMenuInflater().inflate(R.menu.context_menu_colors, menu);
    break;
    case R.id.tvSize:
    getMenuInflater().inflate(R.menu.context_menu_size, menu);
    break;
    }
    }
    4.2
    @Override
    public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.MENU_COLOR_RED:
    tvColor.setTextColor(Color.RED);
    tvColor.setText("Text color = red");
    break;
    case R.id.MENU_COLOR_GREEN:
    tvColor.setTextColor(Color.GREEN);
    tvColor.setText("Text color = green");
    break;
    case R.id.MENU_COLOR_BLUE:
    tvColor.setTextColor(Color.BLUE);
    tvColor.setText("Text color = blue");
    break;
    case R.id.MENU_SIZE_22:
    tvSize.setTextSize(22);
    tvSize.setText("Text size = 22");
    break;
    case R.id.MENU_SIZE_26:
    tvSize.setTextSize(26);
    tvSize.setText("Text size = 26");
    break;
    case R.id.MENU_SIZE_30:
    tvSize.setTextSize(30);
    tvSize.setText("Text size = 30");
    break;
    }
    return super.onContextItemSelected(item);
    }

    • @sergey7dvd
      @sergey7dvd 2 роки тому

      Спасибо!!! PS And me too))

  • @MrMazahell
    @MrMazahell 9 років тому +1

    Мне показалось более логично прогружать меню из отдельных файлов. ДЗ выполнил! :)

  • @GusarEvgeniy
    @GusarEvgeniy 9 років тому

    Домашку выполнил. Создал отдельный xml файл для контекстного меню, подгружаю из него данные методом как для главного меню. Создал две группы и делаю невидимой ту в зависимости где открыто контекстное меню. Понравилось задание)

  • @АнтонЛогинов-ю7й
    @АнтонЛогинов-ю7й 4 роки тому

    Такой вопрос, сделал, но даже при долгом нажатии на смартфоне не открывается меню, в чём может быть проблема?

  • @eagle55077
    @eagle55077 7 років тому

    А могут ли ID ItemMenu пересекаться у разных меню, или JVM это отслеживает? Странно, что public boolean onContextItemSelected(MenuItem item) принимает только Item, без menu.

  • @DennyEryday
    @DennyEryday 9 років тому

    Добрый день! Друзья, не подскажите, как можно добавить кнопку для вызова контекстного меню (например, настройки) на нижнюю панель навигации (где находятся кнопки "Назад", "Home", "Переключение между запущенными программами"). У меня вызывается по нажатию клавиши "Настройки" на реальном устройстве, но когда дело доходит до планшета, я не могу ничего вызвать, т.к. у планшета нет физических кнопок, есть только вот эта нижняя системная панель навигации.

  • @kissvlad2504
    @kissvlad2504 8 років тому +3

    Второе ДЗ подряд не могу сделать :'(
    Подскажите, пожалуйста, как сделать меню через xml и что такое getMenuInflater, про него ведь не было в предыдущих уроках (я внимательно их смотрел! неужели пропустил?)

    • @OmeGGas
      @OmeGGas 8 років тому +5

      Сам не мог решить. Сделал перерыв и пришло озарение)
      /*Делаем меню*/
      public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
      switch (v.getId()){ //смотрим ID элемента на который нажимаем
      case R.id.textView: // если textView
      getMenuInflater().inflate(R.menu.menu_color, menu); //то берем пункты из файла menu_color.xml
      break;
      case R.id.textView3: если textView3
      getMenuInflater().inflate(R.menu.menu_size, menu); //то берем пункты из файла menu_size.xml
      break;
      }
      super.onCreateContextMenu(menu, v, menuInfo);
      }
      /*Проверяем какой пункт нажали*/
      public boolean onContextItemSelected(MenuItem item) {
      switch (item.getItemId()){
      case R.id.redColor: // redColor - это ID пункта меню из файла
      tvColor.setTextColor(Color.RED);break;
      case R.id.greenColor:
      tvColor.setTextColor(Color.GREEN);break;
      case R.id.blackColor:
      tvColor.setTextColor(Color.BLACK);break;
      case R.id.size22:
      tvColor.setTextSize(22);break;
      case R.id.size26:
      tvColor.setTextSize(26);break;
      case R.id.size28:
      tvColor.setTextSize(28);break;
      }
      return super.onContextItemSelected(item);
      }

    • @skodem8148
      @skodem8148 8 років тому

      Спасибо огромное помог, и может в курсе, это inflate выводит на экран то что нам нужно, верно?

    • @OmeGGas
      @OmeGGas 8 років тому

      Верно, метод getMenuInflater() смотрит в указанный тобой файл XML, где уже заранее прописаны пункты)

  • @АрабовМуллошараф
    @АрабовМуллошараф 9 років тому

    Спасибо за уроки.

  • @НиколайЛебедев-ь8т
    @НиколайЛебедев-ь8т 9 років тому +6

    В ДЗ я создал ещё два меню - menu_size, menu_color , а в onCreateContextMenu свичем выбираю, какое меню подгружать с помощью getMenuInflater

    • @start_android
      @start_android  9 років тому

      +Николай Лебедев Отлично)

    • @СергейРезаев-е5н
      @СергейРезаев-е5н 8 років тому

      +Николай Лебедев, а как с помощью getMenuInflater это проделать? Очень интересно

    • @maxxx_wf
      @maxxx_wf 8 років тому

      +Start Android Спасибо за уроки и домашку!

    • @maxkim573
      @maxkim573 8 років тому +3

      +Сергей Прокопенко
      Может еще кому-то понадобиться.
      @Override
      public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
      switch (v.getId()){
      case R.id.tvColor:
      getMenuInflater().inflate(R.menu.context_menu_colors, menu);
      break;
      case R.id.tvSize:
      getMenuInflater().inflate(R.menu.context_menu_size, menu);
      break;
      }
      super.onCreateContextMenu(menu, v, menuInfo);
      }

  • @anle11
    @anle11 9 років тому

    Спасибо за урок, все получилось включая ДЗ, вопрос по уроку
    Зачем мы присваивали значения?
    final int MENU_COLOR_RED = 1;
    final int MENU_COLOR_GREEN = 2;
    final int MENU_COLOR_BLUE = 3;
    final int MENU_SIZE_26 = 4;
    final int MENU_SIZE_30 = 5;
    final int MENU_SIZE_34 = 6;

    • @СергейРезаев-е5н
      @СергейРезаев-е5н 8 років тому +1

      +Антон Белых , можно их и не создавать, тогда в строчке вместо MENU_COLOR_RED например,menu.add(0, MENU_COLOR_RED, 0, "Красный цвет");
      Написать вот так:
      menu.add(0, 1, 0, "Красный цвет");
      Смысл в том что этим константам, присваиваются ID наших элементов в контекстном меню. Но лучше всего это делать из XML файла, что будет выглядить примерно так:
      menu.add(0, R.id.red_id, 0, getString(R.string.redText));

  • @deadfeelings
    @deadfeelings 8 років тому

    11462-11462/com.example.alex.myapplication E/dalvikvm: Could not find class 'android.view.SearchEvent', referenced from method com.example.alex.myapplication
    Хочу запустить на своем телефоне, но пишет эту ошибку

  • @dwfffsw5649
    @dwfffsw5649 7 років тому

    Почему на реальном устройстве нажатие срабатывает через раз? Иногда приходится по нескольку раз нажимать чтобы появилось это меню.

  • @Crusader429
    @Crusader429 5 років тому

    Здравствуйте, а как добавить Checkbox в контекстное меню?
    И возможно ли это?

  • @alextolstoy5367
    @alextolstoy5367 8 років тому

    Здравствуйте,у меня вопрос, написал похожее приложение согласно данному уроку, однако у меня программа имеет следующий вид, ввожу длину траншеи, затем идет контекстное меню где выбираю тип траншеи, в конце считается количество песка и кирпича. Все работает, но если я хочу поменять длину траншеи, то программа не пересчитывает значение,пока опять не выберу тип траншеи из контекстного меню, скажите как можно это исправить. Все операции написал в методе on Content Item selected.

    • @KoperLogic
      @KoperLogic 8 років тому

      раз ты разместил весь код в методе on Content Item selected то у тебя и будет считаться только когда ты будешь щелкать по вплывающему меню. Подумай в какой бы ещё метод можно поместить твой код

  • @Сергей-с1х3ъ
    @Сергей-с1х3ъ 7 років тому

    Ребята помогите пожалуйста ! У меня все сделано,все собрано, когда начинаю запускать
    на эмуляторе,то выходит такая ошибка , не может загрузить приложения (((

  • @sasha_muha_
    @sasha_muha_ 8 років тому

    как сделать так чтоб не было этой долгой задержки при клике, то есть чтоб нажал на кнопку, открылось это Меню, чтоб не зажимать мышку?

    • @start_android
      @start_android  8 років тому

      возможно, эмулятор тупит, пользуйтесь смартфоном для отладки

  • @mrVetronom
    @mrVetronom 9 років тому

    Сделал все по примеру- контекст не работает в моих версиях, скачал пример этого приложения, при открытии проекта ошибка: "failed to find Build Tools revision 23.0.0 rc2",..версии такой в SDK уже нет, пробовал перестроить проект на версии которые у меня: с 2.3.3 по 5.1. (правый клик на проекте->Open Module Settings->Compile SDK Version), возникают ошибки: The project 'P0151_ContextMenu' may be using a version of Gradle that does not contain the method. The build file may be missing a Gradle plugin. Т.е. не находит какого-то сборочного плагина. До этого урока -проблем не было.

    • @grindos
      @grindos 9 років тому

      +MrVetronom попробуйте зайти в меню File -> Invalidate Caches / Restart и нажать Invalidete and Restart.

  • @neded8501
    @neded8501 7 років тому

    Здраствуйте, помогите пожалуйста. При использовании метода findViewById(R.id.tvColor), именно в скобках tvColor выделен красным и пишет что-то не так в классе R.

    • @rufatkhudaiberdiev4453
      @rufatkhudaiberdiev4453 6 років тому

      у вас нет таких id
      в activity_main что у вас? Проверьте id .

  • @diablo1ru
    @diablo1ru 8 років тому

    При финальном запуске, почему-то ругается на эти строчки:
    "
    case MENU_SIZE_22:
    tvSize.setTextSize(22);
    tvSize.setText("Text size = 22");
    break;
    case MENU_SIZE_26:
    tvSize.setTextSize(26);
    tvSize.setText("Text size = 26");
    break;
    case MENU_SIZE_30:
    tvSize.setTextSize(30);
    tvSize.setText("Text size = 30");
    break;"
    Пишет:
    "error: duplicate case label" (3 раза)
    Если удаляю эти строчки - все запускается нормально, только, разумеется, изменение размера не работает. Код пробовал копировать из урока на сайте - все равно выдает ошибку.

    • @diablo1ru
      @diablo1ru 8 років тому

      +diablo1ru все, нашел ошибку. Она заключалась в том, что по невнимательности прописал:
      "final int MENU_COLOR_RED = 1;
      final int MENU_COLOR_GREEN = 2;
      final int MENU_COLOR_BLUE = 3;
      final int MENU_SIZE_22 = 1;
      final int MENU_SIZE_26 = 2;
      final int MENU_SIZE_30 = 3;"
      вместо:
      "final int MENU_COLOR_RED = 1;
      final int MENU_COLOR_GREEN = 2;
      final int MENU_COLOR_BLUE = 3;
      final int MENU_SIZE_22 = 4;
      final int MENU_SIZE_26 = 5;
      final int MENU_SIZE_30 = 6;"

    • @ДядюшкаДжимми
      @ДядюшкаДжимми 8 років тому +1

      Для чего в case писать имена переменных целиком, если вы их инициализировали значениями 1, 2, 3, 4, 5, 6?
      Можно их так и указывать: case 1, case 2...

  • @БэстМаркет
    @БэстМаркет 9 років тому

    AAAAaa, как скопировал и в поиск добавил для быстрого нахождения "onCreateContextMenu"????

  • @ЖеняКоротченко-к6р
    @ЖеняКоротченко-к6р 9 років тому +1

    Спасибо за ваши видеоуроки!
    Android Studio сильно тормозит, даже просто когда менюшки клацаешь...в чем может быть дело?

    • @yual6455
      @yual6455 9 років тому +1

      +Женя Коротченко
      она сама по себе тормозная. Можно ускорить, если:
      - в опциях graddle включить работу офлайн ( поиск в гугл: how to make android studio faster);
      -поставить эмулятор genymotion;
      -установить все на ССД или в ОЗУ на РамДиск
      Я поставил GenyMotion на рамдиск (можно просто перенести виртуальную машину в меню виртуалбокс из папки по умолчанию в папку на рамдиске) Стало в 2 раза быстрее!
      Спасибо за уроки! Хочется побольше заданий в конце каждого.

    • @fifagameru
      @fifagameru 7 років тому

      genymothion только платно? или весть фри варианты?

  • @madhawk00796ify
    @madhawk00796ify 9 років тому +1

    Очень хотелось бы увидеть как создать popup menu для объектов, а то толком ничего не нашел ((
    Или хотя бы ссылку на сайт где это можно посмотреть
    Заранее спасибо ^__^

    • @start_android
      @start_android  9 років тому +2

      Давид Бестаев developer.alexanderklimov.ru/android/popupmenu.php

    • @madhawk00796ify
      @madhawk00796ify 9 років тому

      Start Android благодарю))

  • @alexp7569
    @alexp7569 8 років тому

    можно ли добавить иконку в контекстное меню?

  • @vladshevchuck761
    @vladshevchuck761 3 роки тому

    Как включить контекстное меню просто по нажатию?

  • @dmitrylevanov6948
    @dmitrylevanov6948 8 років тому

    У меня почему-то при создании проектов нет никаких методов кроме onCreate, как это исправить?

    • @KoperLogic
      @KoperLogic 8 років тому

      создавать меню в ручную. В новой версии Android Strudio простой шаблон идет уже без меню, хотя хз почему они решили сделать без него

  • @nobiolo
    @nobiolo 8 років тому

    Что за музон в конце ролика? Динамично.

  • @БэстМаркет
    @БэстМаркет 9 років тому

    Нашел, спасибо!

  • @СтаниславЗаболотный-щ7й

    Подскажите, как создать контекстное меню с функцией КОПИРОВАТЬ

    • @alexflex8585
      @alexflex8585 6 років тому

      используй BufferedReader наверное, так

  • @АлександрСомов-х4р
    @АлександрСомов-х4р 8 років тому

    Как программно создавать меню?

  • @MrHasan96
    @MrHasan96 8 років тому +1

    Все сделал как надо. Нажимаю на текст - реакции нет никакой. Помогите!

    • @start_android
      @start_android  8 років тому

      Ещё раз сравните с исходным кодом урока ваш код. Разместить вопрос в группе vk.com/fandroidinfo. Приложите код к вопросу.

    • @MrHasan96
      @MrHasan96 8 років тому

      +Start Android Спасибо большое. К сожалению, я Вконтактах не сижу. А код с вашего сайта скачал и скопировал - не помогло.

    • @dmitriyp2663
      @dmitriyp2663 8 років тому +1

      Нажатие на текст должно быть долгим, если что)

    • @MrHasan96
      @MrHasan96 8 років тому +1

      Дааа, я сам это понял, хоть и поздно))) Спасибо большое!

  • @СергейРезаев-е5н
    @СергейРезаев-е5н 8 років тому

    Да) Я тоже сделал ДЗ :) Спасибо Вам)