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

237

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

Supongo que esto se puede lograr usando el setExtractViewShown(false)método activado 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

Editado para agregar: la vista a la que va la entrada no es una TextView(es una Viewcon una InputConnectionimplementación personalizada ), por android:imeOptions="flagNoExtractUi"lo que no funcionará aquí.

jnic
fuente
Vamos a intentar verlo. Es bueno para ti. [Mira a este] [1] [1]: stackoverflow.com/questions/8648401/…
sonida
tengo un problema similar :( puede que tengas alguna idea? stackoverflow.com/questions/36914290/…
railwanderer
2
cómo aplicar esto en toda la aplicación. No vamos a agregar el valor de atributo en cada texto de edición en xml.
Vikas Pandey
2
Muchas de las respuestas a continuación recomiendan usar flagNoExtractUio IME_FLAG_NO_EXTRACT_UI. Sin embargo, en la documentación para IME_FLAG_NO_EXTRACT_UI, que corresponde a flagNoExtractUi, establece que "se desaconseja el uso de este indicador y puede quedar obsoleto en el futuro", por lo que flagNoFullscreenes la opción recomendada.
ThomasW

Respuestas:

178

I finalmente respondió 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.
}
jnic
fuente
215
simplemente ponga su archivo xml android: imeOptions = "flagNoExtractUi"
1
jnic, ¿dónde hiciste esa anulación en el código del teclado virtual? SoftKeyboard.java? Intenté la misma anulación y error.
14
Probablemente desee agregar la bandera a las opciones en lugar de anular cualquier opción que se haya pasado de esta manera:outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
ObsidianX
2
@ user726518 ¿cómo aplicar este atributo en el elemento del cuadro de búsqueda en la barra de acción?
Menna-Allah Sami
1
Lo único que funcionó al usar la Vista personalizada para manejar el teclado. ¡Gracias!
Herman
109

Para hacer eso, navegue a la actividad xml y pegue android:imeOptions="flagNoExtractUi"su código. ¿Pero dónde se debe pegar? Eche un vistazo al código de ejemplo de actividad xml y mire 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

pbaranski
fuente
64

agregue la propiedad android:imeOptions="flagNoExtractUi"a cada uno EditTexten su XMLarchivo.

Michael Yaworski
fuente
1
Esta respuesta es demasiado corta y no cumple con los estándares de calidad SO. Mejore esto agregando algunas explicaciones adicionales, para que sea útil para la comunidad y no solo para el OP.
Lorenzo Donati - Codidact.org
31
@LorenzoDonati es exactamente lo que tienes que hacer ... es una respuesta muy simple porque la solución es muy simple y es una forma diferente de hacerlo que las respuestas anteriores. Además, las respuestas no pueden ser "demasiado cortas" a menos que no respondan la pregunta, OMI.
Michael Yaworski el
1
Lo sentimos, pero esto no es lo que la comunidad SO piensa al respecto. Las respuestas no deben limitarse para resolver el problema del OP, deben ser excelentes respuestas en general. Ver esto y esto , por ejemplo.
Lorenzo Donati - Codidact.org
22
@LorenzoDonati es una pregunta muy específica con un solo resultado final (pero múltiples formas de resolverlo). Mi respuesta es una adición a las otras respuestas en esta página. TODAS las respuestas en esta página solo se limitan al "problema de OP" porque ese es el único tipo de respuesta que se puede escribir. Como dije, es específico y simple.
Michael Yaworski el
2
Finalmente, encontré la respuesta. muchas gracias @mike yaworski
Drx
53

La respuesta anterior me ayudó a descubrir la solución para EditTexts añadidos dinámicamente:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Abdo
fuente
37

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

ridoy
fuente
1
Enfoque agradable y mejor para escribir en xml. Funciona para mi. Gracias
Ahesanali Suthar
1
Tenga en cuenta que en la documentación para IME_FLAG_NO_EXTRACT_UI, que corresponde a flagNoExtractUi, indica que "Se desaconseja el uso de este indicador y puede quedar obsoleto en el futuro", por lo que flagNoFullscreenes la opción recomendada.
ThomasW
12

Además, si desea combinar varias imeOptions programáticamente, puede usar | sintaxis.

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

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Maxime Ancelin
fuente
9

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

@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
    ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
    super.onUpdateExtractingVisibility(ei);
}
ObsidianX
fuente
6

Sé que es un poco tarde, pero para cualquier persona que todavía esté interesada, esta es 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 actividad de búsqueda , que se superpuso el teclado causó un problema que el usuario no pudo ver el 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!

Arefeh Iravanchi
fuente
5

Mi solución:

android:imeOptions="flagNoExtractUi|flagNoFullscreen"
dastan
fuente
Esta es una respuesta más actualizada.
alierdogan7
2

Puedes usar :

android:imeOptions="flagNoFullscreen" 

en su texto de edición

Thientvse
fuente
1
¿Es esta una respuesta?
artgb
¡Lo intento y funciona para mí! (Mi dispositivo es Android 4.1.2)
Thientvse
0

Puede llamar para ocultar el teclado virtual y borrar el foco de la vista de búsqueda.

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

super.clearFocus();
mohamed elagamy
fuente