Android долгое нажатие контекстное меню не работает

Русские Блоги

Долгое нажатие Android Edittext не вызывает контекстное меню

Краткое описание проблемы

когда RecycleView В EditText При повторном использовании прокрутки вверх и вниз я обнаружил, что долгое нажатие EditText Контекстное меню не появляется

анализ

После волны отладки я обнаружил, что при нормальных обстоятельствах при долгом нажатии TextView из performClick() Функция возвращает true , Когда нет всплывающего контекста, эта функция возвращает fasle

Первая находка TextView Длительное пресс-мероприятие performLongClick() , Посмотрите его исходный код

Сначала выполните отладку

  • super.performLongClick() Вернуться к false
  • mEditor.performLongCLick() Вернуться к true

Отладка, когда меню не появляется

  • super.performLongClick() Вернуться к false
  • mEdit.performLongClick() Вернуться к false

Тогда проблема в том mEdit.performLongClick() Выше смотрите исходный код

  • mInsertionControllerEnabled Да true

Отладка, когда меню не появляется

  • mInsertionControllerEnable За false

Тогда проблема находится mInsertionControllerEnabled Логическое значение члена, ищущее место, где атрибут этого члена был изменен, найдено в Editor#prepareCursorControllers Внутри просмотрите исходный код

Здесь вы можете увидеть, где проблема, без отладки ViewGroup.LayoutParams params = mTextView.getRootView().getLayoutParams(); Это предложение, если в ViewHolder Если выполняется при связывании данных, он никогда не может быть WindowManager.LayoutParams Потому что в это время EdtiText Не был attachToWindow

решение

Теперь, когда я знаю, что это EditText Не существует attachToWindow Когда называется Editor#prepareCursorControllers Функция, тогда я attachToWindow Разве потом не достаточно снова вызвать эту функцию?

Поскольку это метод разрешения пакетов, вам нужно найти косвенный вызов и найти setCursorVisible Метод вызывается, пока onAttachToWindow Сначала установите false А затем установите true Вот и все

Источник

[Вопросы] Нет подменю при долгом нажатии на экран

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

avatar.png (165.75 KB, Downloads: 0)

2021-07-14 18:25:04 Upload

Иннульча | из app

Жмите на само слово/название, а не на иконку.

Окишев Игорь Ответить | из app

quoteurl=home.php?mod=space&uid=1772867849Иннульча/url
Жмите на само слово/название, а не на иконку./quote

Не получается, все равно открываются сразу сведения, версия миуи 12.0.3

Иннульча | из app

Окишев Игорь
Не получается, все равно открываются сразу сведения, версия миуи 12.0.3

Screenshot_2021-07-14-14-32-44-738_com.miui.home.jpg (319.67 KB, Downloads: 0)

2021-07-14 19:33:39 Upload

Screenshot_2021-07-14-14-32-32-071_com.miui.home.jpg (215.51 KB, Downloads: 0)

2021-07-14 19:33:39 Upload

Fireb1rd | из Mi 9T

Окишев Игорь Ответить | из app

Screenshot_2021-07-14-21-52-32-636_com.android.settings.jpg (236.12 KB, Downloads: 0)

2021-07-14 22:52:47 Upload

На многих последних обновлениях оно отключено. Ждите следующих. Фактически весь функционал можно использовать и без этого меню. Закрепление приложений (замочек) в безопасности. Настройки — и так в них попадаете при долгом нажатии.

zecus | из Redmi 7A

Evgeny Morozov
На многих последних обновлениях оно отключено. Ждите следующих. Фактически весь функционал можно использовать и без этого меню. Закрепление приложений (замочек) в безопасности. Настройки — и так в них попадаете при долгом нажатии.

А вот замочка как раз таки и нет,по крайней мере у меня

zecus | из Redmi 7A

Evgeny Morozov
В безопасности должно быть MIUI 12 — Закрепление приложений

Есть оно там,но ,к сожалению,это не так удобно как было:((

Ждем следующих обновлений )) Думаю вернут. По крайней мере на 12.5 это меню имеет место быть.

Xiaomi Comm APP

Получайте новости о Mi продукции и MIUI

Рекомендации

* Рекомендуется загружать изображения для обложки с разрешением 720*312

Изменения необратимы после отправки

Cookies Preference Center

We use cookies on this website. To learn in detail about how we use cookies, please read our full Cookies Notice. To reject all non-essential cookies simply click «Save and Close» below. To accept or reject cookies by category please simply click on the tabs to the left. You can revisit and change your settings at any time. read more

These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services such as setting your privacy preferences, logging in or filling in formsYou can set your browser to block or alert you about these cookies, but some parts of thesite will not then work. These cookies do not store any personally identifiable information.

These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services such as setting your privacy preferences, logging in or filling in formsYou can set your browser to block or alert you about these cookies, but some parts of thesite will not then work. These cookies do not store any personally identifiable information.

These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services such as setting your privacy preferences, logging in or filling in formsYou can set your browser to block or alert you about these cookies, but some parts of thesite will not then work. These cookies do not store any personally identifiable information.

Источник

Контекстное меню и подменю

Кроме стандартного меню в Android используется также контекстное меню, вызываемое при нажатии на объект в течение двух-трёх секунд (событие long-press). Также на некоторых моделях устройств контекстное меню можно вызвать при нажатии трекбола или средней кнопки манипулятора D-pad. В отличие от обычного меню, в контекстном меню не поддерживаются значки и быстрые клавиши. Второе важно отличие — контекстное меню применимо к компоненту, а меню к активности. Поэтому в приложении может быть одно меню и несколько контекстных меню, например, у каждого элемента TextView.

Программное создание контекстного меню

Для создания контекстного меню используется метод обратного вызова onCreateContextMenu(). В данный метод можно добавлять пункты меню при помощи методов add(). C помощью метода onContextItemSelected() можно обрабатывать выбор пункта. Но сначала надо зарегистрировать контекстное меню для нужного объекта, например, для TextView при помощи метода registerForContextMenu().

Если запустить проект, то уже сейчас можно увидеть контекстное меню, которое пока не будет реагировать на выбранные пункты меню.

Допишем код для выбранного пункта меню.

Контекстное меню через ресурсы

Если вам нужно создать локализованный продукт, то программное добавление пунктов контекстного меню не подойдёт. В таких случаях используется традиционный способ через файл ресурсов, рекомендованный Google.

Создадим XML-файл res/menu/context_menu.xml для меню, а также добавим в разметку ещё один TextView:

Добавляем код к существующему.

Мы используем похожий код, как и при создании стандартного меню. В результате получим контекстное меню, созданное из ресурсов. При выборе нужного пункта изменится либо цвет, либо размер шрифта в TextView.

Источник

Полный список

В этом уроке мы:

— создадим контекстное меню

Контекстное меню вызывается в Андроид длительным нажатием на каком-либо экранном компоненте. Обычно оно используется в списках, когда на экран выводится список однородных объектов (например письма в почт.ящике) и, чтобы выполнить действие с одним из этих объектов, мы вызываем контекстное меню для него. Но т.к. списки мы еще не проходили, сделаем пример попроще и будем вызывать контекстное меню для TextView.

Project name: P0151_ContextMenu
Build Target: Android 2.3.3
Application name: ContextMenu
Package name: ru.startandroid.develop.contextmenu
Create Activity: MainActivity

Откроем main.xml и нарисуем там два TextView:

Для первого TextView мы сделаем контекстное меню, с помощью которого будем менять цвет текста. Для второго – будем менять размер текста.

Принцип создания контекстного меню похож на создание обычного меню. Но есть и отличия.

Метод создания onCreateContextMenu вызывается каждый раз перед показом меню. На вход ему передается:

ContextMenu, в который мы будем добавлять пункты
View — элемент экрана, для которого вызвано контекстное меню
ContextMenu.ContextMenuInfo – содержит доп.информацию, когда контекстное меню вызвано для элемента списка. Пока мы это не используем, но, когда будем изучать списки, увидим, что штука полезная.

Метод обработки onContextItemSelected аналогичный методу onOptionsItemSelected для обычного меню. На вход передается MenuItem – пункт меню, который был нажат.

Также нам понадобится третий метод registerForContextMenu. На вход ему передается View и это означает, что для этой View необходимо создавать контекстное меню. Если не выполнить этот метод, контекстное меню для View создаваться не будет.

Давайте кодить, открываем MainActivity.java. Опишем и найдем TextView и укажем, что необходимо создавать для них контекстное меню.

Теперь опишем создание контекстных меню. Используем константы для хранения ID пунктов меню.

Обратите внимание, что мы по ID определяем View, для которого вызвано контекстное меню и в зависимости от этого создаем определенное меню. Т.е. если контекстное меню вызвано для tvColor, то мы создаем меню с перечислением цветов, а если для tvSizeс размерами шрифта.

В качестве ID пунктов мы использовали константы. Группировку и сортировку не используем, поэтому используем нули в качестве соответствующих параметров.

Можно все сохранить и запустить. При долгом нажатии на TextView должны появляться контекстные меню.

Но нажатие на них ничего не дает, т.к. мы не прописали обработку в методе onContextItemSelected. Давайте пропишем:

В этом методе мы определяем по ID, какой пункт меню был нажат. И выполняем соответствующие действия: меняем цвет текста для tvColor или размер шрифта для tvSize. Сохраняем, запускаем и проверяем, что контекстные меню теперь реагируют на нажатия и делают то, что от них требуется.

Для расширения кругозора я хотел бы еще кое-что написать по этой теме. Возможно, это покажется пока сложноватым, так что если вдруг будет непонятно, ничего страшного. Итак, мысли вслух.

Мы использовали метод registerForContextMenu (View view) для включения контекстного меню для определенного View. Этот метод принадлежит классу Activity. Я посмотрел исходники этого метода, там написано следующее:

Вспоминаем наш урок по обработчикам и смотрим хелп по методу setOnCreateContextMenuListener (View.OnCreateContextMenuListener l). Получается, что View в качестве обработчика создания контекстного меню использует объект this. В данном случае, этот код в Activity, значит this – это Activity и есть. Т.е. когда View хочет показать контекстное меню, оно обращается к обработчику (Activity), а он уже выполняет свой метод onCreateContextMenu. Т.е. тот же самый принцип, что и при обычном нажатии (Click).

И строка в MainActivity.java:

абсолютно равнозначна этой строке:

Вообще мы можем создать свой объект, реализующий интерфейс View.OnCreateContextMenuListener и использовать его вместо Activity в качестве обработчика создания контекстного меню.

Не забывайте, что для контекстного меню вы также можете использовать XML-способ, который был рассмотрен в конце прошлого урока. Попробуйте сделать этот же урок, но уже с использованием XML-меню.

Полный код урока:

На следующем уроке:

— рисуем экран программно, а не через layout-файл

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Читайте также:  Установить андроид совместно с виндовс
Оцените статью