6

Просто попытался проверить приложение на реальном устройстве (HTC Desire Z с Android 2.2). И обнаружил, что мои контекстные меню вообще не работают на EditText с. В противном случае контекстные меню работают: в ListView, ImageView и так далее. На эмуляторе все отлично работает ...onCreateContextMenu() для EditText не работает на реальном устройстве

Когда я нажимаю на EditText, он показывает что-то вроде рамки масштабирования, а затем показывает необычное (не стандартное Android-подобное) контекстное меню, которое гласит: «выбрать текст», «выбрать все». Он не показывает мои меню. Вот скриншоты:

  1. Before tap
  2. During tap
  3. After tap (просто обычный выберите текст, выбрать все, паста)

, но не мое меню, как в эмуляторе - look here

Вот исходный код моей деятельности:

public class MyActivity extends Activity 
{ 
    private static final String TAG=MyActivity.class.getName(); 

    EditText editText; 
    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     editText=(EditText)findViewById(R.id.editText); 
     this.registerForContextMenu(editText); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) 
    { 
     Log.v(TAG, "Creating context menu for view="+view); 
     menu.add(Menu.NONE, Menu.FIRST+1, Menu.NONE, "Test menu"); 
     super.onCreateContextMenu(menu, view, menuInfo); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) 
    { 
     Log.v(TAG, "Context item selected as="+item.toString()); 
     return super.onContextItemSelected(item); 
    } 
} 

Я полностью отлаживал/регистрировал все вокруг моего кода, но все же Activity.onCreateContextMenu() даже не звонил (хотя он зарегистрирован надлежащим образом).

Помогите - что это может быть? Связано ли это с особенностями HTC?

+0

Не могли бы вы разместить снимок экрана контекстного меню? – CommonsWare

+0

Мне также интересно посмотреть скриншот того, что вы видите. У меня есть оригинальное Desire, и я просто попробовал это с моим телефоном, и я правильно получил свое собственное контекстное меню с заголовком/заголовком заголовка и моими вариантами, когда я долгое время нажимаю EditText. – Squonk

+0

Как только у меня будет доступ к компьютеру с поддержкой отладки USB, я сделаю скриншоты.Я предполагаю, что это произойдет сегодня вечером (из Москвы/России) – barmaley

ответ

7

Да, я думаю, что вы видите, есть меню HTC.

Графическое контекстное меню редактирования, которое вы видите, я считаю, новым для более поздних моделей Desire (Desire HD и Desire Z). То, что я вижу (с вашим кодом) в своем оригинальном Desire, представляет собой всплывающее текстовое меню с заголовком HeaderTitle, установленным как «Редактировать текст» и список, например «Выбрать все», «Копировать», «Вставить» и т. Д., Но я также см. запись «Test menu».

Мне кажется, что при вызове onCreateContextMenu() для таких вещей, как ListView и ImageView, объект «меню», переданный этому вызову, по умолчанию не заполняется. Однако в случае с EditText он предназначен для взаимодействия с буфером обмена, и поэтому система предоставляет предварительно заполненное меню на основе состояния содержимого EditText (например, если текст выбран, укажите параметр «Копировать»; если в буфере обмена есть текст, поставьте опцию «Вставить» и т. д.).

Я был в состоянии получить контекстное меню без опций «Edit», очистив заголовок и содержимое путем изменения кода ...

@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, который передается ему.

EDIT 1: Переосмыслив это, вы упоминаете, что вы нажимаете «EditText» - это то, что вы на самом деле делаете (короткое касание вниз, а затем пальцем вверх)?

Чтобы получить мой ContextMenu, я должен использовать «длинный» щелчок (нажмите и удерживайте в течение 1 секунды). Когда я просто коснусь моего EditText, появляется «мягкая» клавиатура или, если клавиатура уже видна, курсор просто перемещается в другое место в поле EditText.

Очевидно, что у Desire Z есть физическая клавиатура, и это может привести к немногому поведению (а также к желанию Z, имеющему другую версию интерфейса Sense для моего желания).

Тот факт, что onCreateContextMenu() никогда не вызывается для вас, может означать только одно, и именно то, что вы видите, НЕ является контекстом и является другим типом всплывающего пользовательского интерфейса. По крайней мере, это единственный логический способ понять это.

Можете ли вы подтвердить, что «длинная» печать по-прежнему не создает ContextMenu для вас или вы долго пользовались долгой печатью?

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

  1. Реализовать OnClickListener

    public class MyActivity extends Activity 
        implements OnLongClickListener { 
    
  2. Установите приемник для EditText в 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 
    } 
    
  3. Добавить код слушателя ...

    @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; 
        } 
    } 
    

Делая это, я смог перехватить длинную прессу и, возвращая «истинный» из onLongClick() Я указывающий на систему, что я «потребляются» событие и он не передается, чтобы вызвать создание моего ContextMenu.

Если это не работает для вас, и кратковременное нажатие по-прежнему вызывает появление всплывающего окна, попробуйте выполнить OnClickListener и вместо этого переопределить onClick().

Объект упражнения состоит в том, что если вы можете перехватить все, что вызывает создание всплывающего окна, которое вы видите, вы можете вручную создать и показать свой собственный ContextMenu.

+0

Thanx Я проверю ваши идеи ... – barmaley

+0

Нет, он не вызывает onCreateContextMenu() - Я дважды проверил все. Пожалуйста помоги! Есть идеи? – barmaley

+0

@barmaley: Посмотрите мой ответ в конец, где я начинаю EDIT 1: – Squonk

-1

Это стандартное меню вырезания/копирования/вставки, которое вы видите.

Смотрите эту тему для более подробной информации:

How can I write my own context menu for copy & paste?

С уважением HJW

+0

Вы читали вопрос? – barmaley

 Смежные вопросы

  • Нет связанных вопросов^_^