Я делаю вертикальный EditText
для традиционного монгольского. Я успешно реализовал его, введя слегка измененный EditText
внутри повернутого ViewGroup
. Мне нужно создать полностью настраиваемое контекстное меню, потому что система не поддерживает вертикальный текст и не поворачивается при повороте ViewGroup
. Поэтому я хочу полностью отключить контекстное меню системы.
Обратите внимание, что это отличается от этих вопросов, которые просто пытаются отключить copy/paste/etc.:
- Как отключить копирование/вставку из/в EditText
- EditText: Отключить всплывающее меню "Вставить/Заменить" в событии Clicker для выбора текста
- как отключить параметр вставки в android EditText
- Android: как полностью отключить функцию копирования и вставки в Edittext
Хотя я не получаю контекстное меню, появляющееся в симуляторе, я получаю его на моем Android 5.0.2 Xiaomi.
Я пробовал:
-
setCustomSelectionActionModeCallback
" решение -
setLongClickable(false);
" решение -
onTouchEvent
" решение
Я открыт для взлома, но мне нужно, чтобы он постоянно работал на разных устройствах. Марк Мерфи (Commons Guy) написал некоторое время назад в ответ другому пользователю, пытающемуся сделать что-то подобное:
Я подозреваю, что даже если вы придумаете ответ, это не сработает через устройства. У производителей устройств была склонность собственное "контекстное меню" для EditText, победив попытки разработчиков добавить элементов в это контекстное меню. Я предполагаю, что попытка блокировать контекстное меню будет иметь похожие результаты.
Мне повезло?
Единственное, что я могу сейчас подумать, - полностью переписать TextView
и EditText
с нуля (ну, изменив исходный код Android). Я знаю кого-то другого, кто сделал что-то подобное, но его код не является открытым исходным кодом. Прежде чем я сделаю этот важный шаг, я хочу попытаться попросить более простое решение здесь в Stack Overflow.
Обновление: Я пытался изменить исходный код TextView
за последние два дня, и он выглядит как 6-месячный проект. Это масса взаимосвязанных классов. Мне нужно другое решение, но у меня нет идей.
MVCE
Это самый простой способ подумать о том, чтобы воссоздать проблему. Из моего пользовательского EditText
нет ничего необходимого. Макет имеет один EditText
, сделанный путем замены проекта по умолчанию Hello World TextView
. Я изменил min API до 11, чтобы избежать использования устаревших методов.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editText = (EditText) findViewById(R.id.edit_text);
editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { return false; }
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { return false; }
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { return false; }
@Override
public void onDestroyActionMode(ActionMode actionMode) { }
});
}
}
Контекстное меню в симуляторе (работает API 24) все еще отображается, когда я нажимаю на дескриптор курсора (но не на длинный клик или двойной щелчок). Вот изображение:
На моем телефоне Xiaomi MIUI под управлением Android 5.0 я получаю контекстное меню во всех ситуациях (щелчок курсора, длинный щелчок, двойной щелчок).
Update
Решение Aritra Roy работает в симуляторе, на некоторых других устройствах, которые он тестировал, и на моем устройстве. Я принял его ответ, потому что он решает мою оригинальную проблему. Единственным отрицательным побочным эффектом является то, что выбор текста также отключен.