6

Acabo de intentar probar mi aplicación en un dispositivo real (HTC Desire Z con Android 2.2). Y descubrí que mis menús contextuales no funcionan en absoluto en EditText s. De lo contrario, los menús contextuales funcionan: en ListView, ImageView y así sucesivamente. En el emulador todo funciona bien ...onCreateContextMenu() para EditText no funciona en el dispositivo real

Cuando toco EditText, se muestra algo así como zoom frame y luego muestra el menú contextual inusual (no Android estándar) que dice: "seleccionar texto", "seleccionar todo". No muestra mis menús imágenes aquí son:

  1. Before tap
  2. During tap
  3. After tap (Seleccionar texto sólo normal, seleccionar todo, pegar)

pero sin mi menú como en el emulador - look here

Aquí está el código fuente de mi actividad:

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

He depurado/registrado completamente todo lo que rodea mi código, pero aun así Activity.onCreateContextMenu() ni siquiera se ha llamado (aunque está registrado correctamente).

Ayuda, ¿qué puede ser? ¿Está relacionado con las peculiaridades de HTC?

+0

¿Podría publicar una captura de pantalla del menú contextual? – CommonsWare

+0

También tengo curiosidad por ver una captura de pantalla de lo que está viendo. Tengo un deseo original y acabo de probar esto con mi teléfono y obtengo mi propio menú contextual con el ícono/título del encabezado y mis elecciones cuando presiona mi EditText. – Squonk

+0

Tan pronto como tenga acceso a la PC con depuración USB, tomaré capturas de pantalla.Supongo que sucederá hoy por la noche (hora de Moscú/Rusia) – barmaley

Respuesta

7

Sí, creo que lo que está viendo hay un menú de HTC.

El menú contextual de edición gráfica que está viendo es, creo, nuevo para los modelos más recientes de Desire (Desire HD y Desire Z). Lo que veo (con su código) en mi deseo original es un menú emergente basado en texto con HeaderTitle configurado como 'Editar texto' y una lista como 'Seleccionar todo', 'Copiar', 'Pegar', etc. PERO, yo también vea una entrada que dice 'Menú Prueba'.

Se me ocurre que cuando se llama a onCreateContextMenu() para elementos como ListView e ImageView, el objeto 'menú' transferido a esa llamada no se rellena previamente de forma predeterminada. En el caso de un EditText, sin embargo, está diseñado para interactuar con el Portapapeles y, como tal, el sistema proporciona un menú pre-poblado basado en el estado del contenido de EditText (por ejemplo, si se selecciona texto, proporcione una opción 'Copiar'; si hay texto en el portapapeles, proporcione una opción 'Pegar' ... y así sucesivamente).

que era capaz de conseguir un menú de contexto y sin las opciones 'Editar' en la limpieza de la cabecera y el contenido modificando su código ...

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

El hecho de que está recibiendo un menú gráfico (posiblemente deriva de ContextMenu) sugiere que la técnica anterior no funcionará, por lo que la única manera sería crear una instancia de su propio objeto ContextMenu en lugar de usar el que se pasó a onCreateContextMenu().

He depurado a fondo/registra todo alrededor de mi código, pero todavía Activity.onCreateContextMenu() ni siquiera se llama

Esto parece muy extraño - es obvio que está siendo llamado para mí, ya que he podido para jugar con el ContextMenu que se le está pasando.

EDITAR 1: Repensando esto, mencionas que "tocas" EditText - ¿eso es lo que estás haciendo (un toque corto hacia abajo y luego un dedo hacia arriba)?

Para obtener mi ContextMenu tengo que presionar "largo"/clic (mantener presionado durante aproximadamente 1 segundo). Cuando simplemente toco/toco mi EditText, aparece el teclado "suave" o, si el teclado ya está visible, el cursor simplemente se mueve a una posición diferente en el cuadro EditText.

Obviamente, el Desire Z tiene un teclado físico y eso puede causar un comportamiento ligeramente diferente (así como el deseo tener una versión diferente de la interfaz de usuario de Sense a mi deseo).

El hecho de que onCreateContextMenu() nunca se invoque para usted puede significar solo una cosa y es que, lo que está viendo NO es un ContextMenu y es algún otro tipo de elemento emergente de UI. Al menos esa es la única forma lógica en que puedo entenderlo.

¿Puedes confirmar que una imprenta 'larga' aún no crea un ContextMenu para ti o has estado usando una pulsación larga todo el tiempo?

Si ha intentado una pulsación larga a continuación, tratar de modificar el código de la siguiente manera ...

  1. Implementar OnClickListener

    public class MyActivity extends Activity 
        implements OnLongClickListener { 
    
  2. Establecer el oyente para EDITTEXT en 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. Agregue el código de escucha ...

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

Al hacer esto, yo soy capaz de interceptar la pulsación larga y, mediante la devolución de 'verdadero' de onLongClick() Estoy indicar al sistema que he 'consumido' el evento y no se transfiere para causar la creación de mi ContextMenu.

Si esto no funciona para usted y un toque corto todavía provoca que esa ventana emergente aparezca, entonces intente implementar OnClickListener y anular onClick() en su lugar.

El objetivo del ejercicio es que si puede interceptar lo que está causando la creación de la ventana emergente que está viendo, puede crear manualmente y mostrar su propio ContextMenu.

+0

Gracias Revisaré sus ideas ... – barmaley

+0

No, no llama aCreateContextMenu() - He verificado todo. ¡Por favor ayuda! ¿Algunas ideas? – barmaley

+0

@barmaley: Vea mi respuesta hacia el final donde empiezo EDIT 1: – Squonk

Cuestiones relacionadas