Урок 15. Создаем контекстное меню для экранных компонентов в андроид приложениях (Android Studio)
Вставка
- Опубліковано 16 жов 2024
- Простой пример контекстного меню (ContextMenu) для View элементов экрана андроид приложения. Будем вызывать для TextView контекстное меню со списком пунктов, по нажатию на которые будем динамически менять цвет и размер шрифта в TextView.
Весь плейлист: • Уроки по основам разра...
Ссылки и исходный код на странице урока: www.fandroid.in...
#android #AndroidStudio #startandroid
Большое спасибо за уроки! Очень нравятся. Все доходчиво и сделано качественно и видно с душой. Надеюсь вы это дело не забросите, как это иногда бывает. Аналогичных уроков такого уровня больше не нашел. Спасибо!
Только позовчера написал как бы хотелось видеть больше роликов под Android studio и вуаля. Спасибо огромное!!!
Продалжайте в том-же духе и храни вас бог.
Ivan Gurtuev спасибо(:
По поводу ДЗ) Из xml загружать меню очень удобно и просто! Создаем в ресурсах 2 меню для цвета и размера шрифта, там указываем понятные ид.
В onCreateContextMenu используем вместо menu.add(...) команду загрузки элементов меню из ресурсов getMenuInflater().inflate(R.menu.menu_tvcolor, menu);
Спасибо за видеоурок!
Алексей Горшков можно и один файл меню, разбив элементы на группы и добавив в обработку создания команды
menu.setGroupVisible(R.id.colorMenuGroup, false);
menu.setGroupVisible(R.id.sizeMenuGroup, true);и наоборот для второго TextView
Не понял какие два меню и где надо создавать? В левой части столбца, под activity_main?
Подробное описание по выполнению ДЗ на 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);
}
Спасибо!!! PS And me too))
Мне показалось более логично прогружать меню из отдельных файлов. ДЗ выполнил! :)
Домашку выполнил. Создал отдельный xml файл для контекстного меню, подгружаю из него данные методом как для главного меню. Создал две группы и делаю невидимой ту в зависимости где открыто контекстное меню. Понравилось задание)
Такой вопрос, сделал, но даже при долгом нажатии на смартфоне не открывается меню, в чём может быть проблема?
А могут ли ID ItemMenu пересекаться у разных меню, или JVM это отслеживает? Странно, что public boolean onContextItemSelected(MenuItem item) принимает только Item, без menu.
Добрый день! Друзья, не подскажите, как можно добавить кнопку для вызова контекстного меню (например, настройки) на нижнюю панель навигации (где находятся кнопки "Назад", "Home", "Переключение между запущенными программами"). У меня вызывается по нажатию клавиши "Настройки" на реальном устройстве, но когда дело доходит до планшета, я не могу ничего вызвать, т.к. у планшета нет физических кнопок, есть только вот эта нижняя системная панель навигации.
Второе ДЗ подряд не могу сделать :'(
Подскажите, пожалуйста, как сделать меню через xml и что такое getMenuInflater, про него ведь не было в предыдущих уроках (я внимательно их смотрел! неужели пропустил?)
Сам не мог решить. Сделал перерыв и пришло озарение)
/*Делаем меню*/
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);
}
Спасибо огромное помог, и может в курсе, это inflate выводит на экран то что нам нужно, верно?
Верно, метод getMenuInflater() смотрит в указанный тобой файл XML, где уже заранее прописаны пункты)
Спасибо за уроки.
В ДЗ я создал ещё два меню - menu_size, menu_color , а в onCreateContextMenu свичем выбираю, какое меню подгружать с помощью getMenuInflater
+Николай Лебедев Отлично)
+Николай Лебедев, а как с помощью getMenuInflater это проделать? Очень интересно
+Start Android Спасибо за уроки и домашку!
+Сергей Прокопенко
Может еще кому-то понадобиться.
@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);
}
Спасибо за урок, все получилось включая ДЗ, вопрос по уроку
Зачем мы присваивали значения?
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;
+Антон Белых , можно их и не создавать, тогда в строчке вместо 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));
11462-11462/com.example.alex.myapplication E/dalvikvm: Could not find class 'android.view.SearchEvent', referenced from method com.example.alex.myapplication
Хочу запустить на своем телефоне, но пишет эту ошибку
Почему на реальном устройстве нажатие срабатывает через раз? Иногда приходится по нескольку раз нажимать чтобы появилось это меню.
Здравствуйте, а как добавить Checkbox в контекстное меню?
И возможно ли это?
Здравствуйте,у меня вопрос, написал похожее приложение согласно данному уроку, однако у меня программа имеет следующий вид, ввожу длину траншеи, затем идет контекстное меню где выбираю тип траншеи, в конце считается количество песка и кирпича. Все работает, но если я хочу поменять длину траншеи, то программа не пересчитывает значение,пока опять не выберу тип траншеи из контекстного меню, скажите как можно это исправить. Все операции написал в методе on Content Item selected.
раз ты разместил весь код в методе on Content Item selected то у тебя и будет считаться только когда ты будешь щелкать по вплывающему меню. Подумай в какой бы ещё метод можно поместить твой код
Ребята помогите пожалуйста ! У меня все сделано,все собрано, когда начинаю запускать
на эмуляторе,то выходит такая ошибка , не может загрузить приложения (((
как сделать так чтоб не было этой долгой задержки при клике, то есть чтоб нажал на кнопку, открылось это Меню, чтоб не зажимать мышку?
возможно, эмулятор тупит, пользуйтесь смартфоном для отладки
Сделал все по примеру- контекст не работает в моих версиях, скачал пример этого приложения, при открытии проекта ошибка: "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. Т.е. не находит какого-то сборочного плагина. До этого урока -проблем не было.
+MrVetronom попробуйте зайти в меню File -> Invalidate Caches / Restart и нажать Invalidete and Restart.
Здраствуйте, помогите пожалуйста. При использовании метода findViewById(R.id.tvColor), именно в скобках tvColor выделен красным и пишет что-то не так в классе R.
у вас нет таких id
в activity_main что у вас? Проверьте id .
При финальном запуске, почему-то ругается на эти строчки:
"
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 все, нашел ошибку. Она заключалась в том, что по невнимательности прописал:
"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;"
Для чего в case писать имена переменных целиком, если вы их инициализировали значениями 1, 2, 3, 4, 5, 6?
Можно их так и указывать: case 1, case 2...
AAAAaa, как скопировал и в поиск добавил для быстрого нахождения "onCreateContextMenu"????
Спасибо за ваши видеоуроки!
Android Studio сильно тормозит, даже просто когда менюшки клацаешь...в чем может быть дело?
+Женя Коротченко
она сама по себе тормозная. Можно ускорить, если:
- в опциях graddle включить работу офлайн ( поиск в гугл: how to make android studio faster);
-поставить эмулятор genymotion;
-установить все на ССД или в ОЗУ на РамДиск
Я поставил GenyMotion на рамдиск (можно просто перенести виртуальную машину в меню виртуалбокс из папки по умолчанию в папку на рамдиске) Стало в 2 раза быстрее!
Спасибо за уроки! Хочется побольше заданий в конце каждого.
genymothion только платно? или весть фри варианты?
Очень хотелось бы увидеть как создать popup menu для объектов, а то толком ничего не нашел ((
Или хотя бы ссылку на сайт где это можно посмотреть
Заранее спасибо ^__^
Давид Бестаев developer.alexanderklimov.ru/android/popupmenu.php
Start Android благодарю))
можно ли добавить иконку в контекстное меню?
Как включить контекстное меню просто по нажатию?
У меня почему-то при создании проектов нет никаких методов кроме onCreate, как это исправить?
создавать меню в ручную. В новой версии Android Strudio простой шаблон идет уже без меню, хотя хз почему они решили сделать без него
Что за музон в конце ролика? Динамично.
Нашел, спасибо!
Подскажите, как создать контекстное меню с функцией КОПИРОВАТЬ
используй BufferedReader наверное, так
Как программно создавать меню?
Все сделал как надо. Нажимаю на текст - реакции нет никакой. Помогите!
Ещё раз сравните с исходным кодом урока ваш код. Разместить вопрос в группе vk.com/fandroidinfo. Приложите код к вопросу.
+Start Android Спасибо большое. К сожалению, я Вконтактах не сижу. А код с вашего сайта скачал и скопировал - не помогло.
Нажатие на текст должно быть долгим, если что)
Дааа, я сам это понял, хоть и поздно))) Спасибо большое!
Да) Я тоже сделал ДЗ :) Спасибо Вам)