2012-02-27 10 views
7

Tengo un EditText y quiero que el usuario pueda seleccionar texto y aplicar un formato básico al texto seleccionado (negrita, cursiva, etc.). Sin embargo, aún quiero las opciones estándar de copia, corte y pegado. Leí en algún lugar de la documentación de Android que para hacer esto, debes llamar a setCustomSelectionActionModeCallback() en EditText y pasarle un ActionModeCallback(), así que eso es lo que hice. Aquí está mi código:El botón de desbordamiento fuerza el modo de acción para finalizar

En onCreate de mi actividad() Método: declaración

myEditText.setCustomSelectionActionModeCallback(new TextSelectionActionMode()); 

de devolución de llamada:

private class TextSelectionActionMode implements ActionMode.Callback { 
    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     return false; 
    } 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     menu.add("Bold"); 
     return true; 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 
} 

El problema que estoy teniendo es que cuando hago clic en el botón de desbordamiento (a acceder a mi elemento de menú "Negrita"), el Modo de Acción se cierra inmediatamente. Si fijo que se muestre siempre como una acción, el uso de este:

MenuItem bold = menu.add("Bold"); 
bold.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS); 

Funciona bien y puede hacer clic en él (aunque, obviamente, no hace nada). ¿Que me estoy perdiendo aqui?

Editar: Solo quería agregar que me encuentro con exactamente el mismo problema si realmente inflar un menú en lugar de agregar elementos de menú programáticamente. Una vez más, sin embargo, el problema desaparece si lo obligo a mostrar siempre como una acción.

Respuesta

3

Es un problema de marcos. Si textview recibe el evento 'focus changed', la vista de texto detiene el modo de acción. Cuando se muestra la ventana emergente de desbordamiento, la vista de texto omite el foco.

+0

Ok, ¿cómo se puede prevenir el problema? – MBulava

1

Este problema se ha resuelto en Android 6.0. Sin embargo, debe usar ActionMode.Callback2 como se describe here en Android 6.0.

Para Android 5.xy siguientes, recomiendo esta solución: agregue un botón a Toolbar o ActionBar que registra la selección actual y luego abre otro menú contextual.

this.inputText_selectionStart = inputText.getSelectionStart(); 
this.inputText_selectionEnd = inputText.getSelectionEnd(); 
registerForContextMenu(inputText); 
openContextMenu(inputText); 
unregisterForContextMenu(inputText); 
Cuestiones relacionadas