Deshabilitar la vista de edición de pantalla completa para la entrada de teclado en horizontal?


En dispositivos Android que usan teclados suaves, quiero evitar que la vista de edición de teclado de pantalla completa (que se muestra a continuación) aparezca cuando esté en modo horizontal (es decir, quiero ver solo el teclado suave y mi vista detrás de él).

Asumo que esto se puede lograr usando el método setExtractViewShown(false) en InputMethodService, pero no puedo acceder a la instancia predeterminada de esto y no quiero implementar un método de entrada personalizado.

Vista de edición de pantalla completa de Android

Edited to add: la vista a la que la entrada es ir no es un TextView (es un View con una implementación personalizada InputConnection), por lo que android:imeOptions="flagNoExtractUi" no funcionará aquí.

Author: jnic, 2010-12-02

11 answers

Finalmente respondí a mi propia pregunta:

La interfaz de usuario de extracción (es decir, el modo de edición de pantalla completa) se puede desactivar en el punto en el que se conecta la conexión de entrada:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}
 155
Author: jnic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-18 16:47:21

Para hacer eso, simplemente vaya a activity xml y pegue android:imeOptions="flagNoExtractUi" en su código. Hmm bastante simple-pero donde el hac debe ser pegado? Echa un vistazo al código de ejemplo de actividad xml y mira EditText:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"         
    >

    <EditText
        android:imeOptions="flagNoExtractUi"
        android:id="@+id/etTextInAct"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >   
        <requestFocus />
    </EditText>

</LinearLayout>

Si desea más opciones de personalización para el teclado, consulte http://developer.android.com/guide/topics/ui/controls/text.html

 86
Author: pbaranski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-02 06:20:03

Agregue la propiedad android:imeOptions="flagNoExtractUi" a cada EditText en su archivo XML.

 57
Author: Michael Yaworski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-13 02:19:10

La respuesta anterior me ayudó a encontrar la solución para editar textos añadidos dinámicamente:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
 49
Author: Abdo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-02 11:59:26

Use android:imeOptions="flagNoFullscreen" para lograr esa característica.

 33
Author: ridoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-25 17:28:24

También, si desea combinar varias imeopciones programáticamente, puede usar la sintaxis|.

Por ejemplo, para deshabilitar la vista de edición de pantalla completa en horizontal y reemplazar la tecla "Next" por " OK " (ACTION_DONE) en el teclado, puede usar:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
 11
Author: Maxime Ancelin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-08 09:15:49

Si está modificando el IME directamente, puede evitar que muestre un ExtractedView invalidando onUpdateExtractingVisibility:

@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
    ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
    super.onUpdateExtractingVisibility(ei);
}
 9
Author: ObsidianX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-14 02:34:23

Sé que es un poco tarde, pero para cualquiera que todavía esté interesado, aquí está mi solución : En mi caso, tenía una actividad horizontal que contenía un EditText en la parte superior y necesitaba implementar la función de autocompletar en esta búsqueda Actividad, que el teclado superpuesto causó un problema que el usuario no podía ver como resultado de RecyclerView. Así que terminé teniendo este EditText en mi diseño:

<EditText
  android:layout_width="match_parent"
  android:layout_height="?actionBarSize"
  android:id="@+id/main_search_et"
  android:imeOptions="actionSearch|flagNoExtractUi"
  android:inputType="text"  />

Salud!

 4
Author: Arefeh Iravanchi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-16 15:16:59

Puedes usar:

android:imeOptions="flagNoFullscreen" 

En su edittext

 3
Author: Thientvse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-27 02:54:48

Mi solución:

android:imeOptions="flagNoExtractUi|flagNoFullscreen"
 1
Author: dastan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-18 01:58:28

Puede llamar para ocultar el teclado de software y despejar el foco de searchview.

public void hideKeyboard(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

super.clearFocus();
 0
Author: mohamed elagamy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-10 15:35:58