Да, я думаю, что вы видите, что есть меню HTC.
Графическое контекстное меню редактирования, которое вы видите, является, я полагаю, новым для более поздних моделей Desire (Desire HD и Desire Z). То, что я вижу (с вашим кодом) в моем исходном Desire, представляет собой всплывающее текстовое меню с заголовком заголовка, установленным как «Редактировать текст», и списком, таким как «Выбрать все», «Копировать», «Вставить» и т. Д. НО, я также увидеть запись с надписью «Тестовое меню».
Мне приходит в голову, что когда onCreateContextMenu () вызывается для таких вещей, как ListView и ImageView, объект 'menu', передаваемый этому вызову, по умолчанию не заполняется заранее. Однако в случае с EditText он предназначен для взаимодействия с буфером обмена, и поэтому система предоставляет предварительно заполненное меню на основе состояния содержимого EditText (например, если выбран текст, укажите параметр «Копировать»; если в буфере обмена есть текст, укажите «Вставить»; ... и т. д.).
Мне удалось получить контекстное меню без параметров редактирования, очистив заголовок и содержимое, изменив код ...
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo)
{
Log.v(TAG, "Creating context menu for view="+view);
// Clear current contents
menu.clearHeader();
menu.clear();
menu.setHeaderTitle("TEST MENU");
menu.add(Menu.NONE, Menu.FIRST+1, Menu.NONE, "Test menu");
super.onCreateContextMenu(menu, view, menuInfo);
}
Тот факт, что вы получаете графическое меню (возможно, полученное из ContextMenu), предполагает, что описанный выше метод не сработает, поэтому единственный способ обойти это - создать собственный объект ContextMenu, а не использовать объект, переданный в onCreateContextMenu ).
Я полностью отладил / зарегистрировал все вокруг моего кода, но все равно Activity.onCreateContextMenu () даже не вызывается
Это кажется очень странным - очевидно, это вызвано для меня, так как я смог поиграть с ContextMenu, которое ему передается.
РЕДАКТИРОВАТЬ 1: Переосмысливая это, вы упоминаете, что «нажимаете» на EditText - это то, что вы на самом деле делаете (короткое касание, затем палец вверх)?
Чтобы получить мое ContextMenu, я должен использовать «длинное» нажатие / щелчок (коснитесь и удерживайте около 1 секунды). Когда я просто нажимаю / касаюсь своего EditText, появляется «мягкая» клавиатура или, если клавиатура уже видна, курсор просто перемещается в другую позицию в окне EditText.
Очевидно, что Desire Z имеет физическую клавиатуру, и это может привести к немного другому поведению (так же как Desire Z имеет версию интерфейса Sense, отличную от моего Desire).
Тот факт, что onCreateContextMenu () никогда не вызывается для вас, может означать только одну вещь: то, что вы видите, НЕ является ContextMenu и является элементом всплывающего пользовательского интерфейса другого типа. По крайней мере, это единственный логичный способ, которым я могу это понять.
Можете ли вы подтвердить, что «длинное» нажатие все еще не создает ContextMenu для вас, или вы все время использовали длинное нажатие?
Если вы пробовали длительное нажатие, попробуйте изменить код следующим образом ...
Реализация OnClickListener
public class MyActivity extends Activity
implements OnLongClickListener {
Установить прослушиватель для редактирования текста в onCreate ...
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText=(EditText )findViewById(R.id.editText);
this.registerForContextMenu(editText);
editText.setOnLongClickListener(this); // <-- ADD THIS
}
Добавить код слушателя ...
@Override
public boolean onLongClick(View arg0) {
android.util.Log.v(TAG, "onLongClick() called");
if (arg0 == editText)
{
android.util.Log.v(TAG, "arg0 == editText");
Toast.makeText(this, "onLongClick intercepted", 2000).show();
return true;
}
else
{
android.util.Log.v(TAG, "arg0 != editText");
return false;
}
}
Делая это, я могу перехватить длинное нажатие и, возвращая true из onLongClick (), я указываю системе, что я «съел» событие, и оно не прошло вызвать создание моего ContextMenu.
Если это не работает для вас, и короткое нажатие по-прежнему вызывает появление этого всплывающего окна, попробуйте реализовать OnClickListener и переопределить onClick ().
Цель этого упражнения заключается в том, что если вы можете перехватить все, что вызывает создание всплывающего окна, вы можете вручную создать и отобразить свое собственное ContextMenu.