El modo inmersivo pegajoso está deshabilitado después de mostrar el teclado virtual

Tengo una aplicación que necesita ser pantalla completa la mayor parte del tiempo. Sé que si se muestra una alerta o se muestra otra ventana, en la parte superior de la ventana de actividad, la pantalla completa se elimina temporalmente. Desafortunadamente, cuando un teclado suave se muestra para un EditText o algo, cuando el usuario ha terminado con el teclado, el modo de inmersión de pantalla completa no se restaura.

¿Alguna idea de cómo se puede lograr esto?

3 Solutions collect form web for “El modo inmersivo pegajoso está deshabilitado después de mostrar el teclado virtual”

Tomado de esta aplicación de ejemplo de Google , es necesario añadir esto al final de la actividad, antes del último soporte final:

@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); // When the window loses focus (eg the action overflow is shown), // cancel any pending hide action. When the window gains focus, // hide the system UI. if (hasFocus) { delayedHide(300); } else { mHideHandler.removeMessages(0); } } private void hideSystemUI() { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_IMMERSIVE); } private void showSystemUI() { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } private final Handler mHideHandler = new Handler() { @Override public void handleMessage(Message msg) { hideSystemUI(); } }; private void delayedHide(int delayMillis) { mHideHandler.removeMessages(0); mHideHandler.sendEmptyMessageDelayed(0, delayMillis); } 

Y deberías ser bueno. 🙂

Este es el comportamiento normal. Pero puedes arreglarlo en dos pasos:
1. Averigüe cuando el teclado está oculto
2. Ajuste el modo de inmersión en pantalla completa (de nuevo)

Paso 1 es un poco difícil. Puedes ver mi respuesta aquí:
https://stackoverflow.com/a/27567074/2525452

El paso 2 es simple:

 public static void setImmersiveMode( Activity activity ) { // Get the Activity's content View ViewGroup content = (ViewGroup) activity.findViewById( android.R.id.content ); // // Set the immersive mode flags at the content View content.setSystemUiVisibility( View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION ); } 

Sugiero extender AppCompatActivity a una nueva clase (ImmersiveAppCompatActivity). Al hacer esto, cualquier actividad que cree utilizando esta clase se habrá construido en el manejo del modo inmersivo.

Si intenta establecer el modo de inmersión demasiado rápido después de que ha aparecido el teclado suave, no se oculta.

También tenga en cuenta que el controlador se ha mejorado al cambiar a un controlador estático – esto evitará fugas si el usuario deja la actividad antes de que la GUI esté oculta.

 public abstract class ImmersiveAppCompatActivity extends AppCompatActivity { private HideHandler mHideHandler; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // create a handler to set immersive mode on a delay mHideHandler = new HideHandler(this); // set on create setToImmersiveMode(); } @Override protected void onResume() { super.onResume(); setToImmersiveMode(); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(hasFocus) { mHideHandler.removeMessages(0); mHideHandler.sendEmptyMessageDelayed(0, 300); } else mHideHandler.removeMessages(0); } private void setToImmersiveMode() { // set to immersive getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } private static class HideHandler extends Handler { private final WeakReference<ImmersiveAppCompatActivity> mActivity; HideHandler(ImmersiveAppCompatActivity activity) { mActivity = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { ImmersiveAppCompatActivity activity = mActivity.get(); if(activity != null) activity.setToImmersiveMode(); } } } 

Ahora, cree su actividad usando esta clase:

 public class SettingsActivity extends ImmersiveAppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit(); } } 

He probado esto en Android 5.1 y 7.0 para trabajar en una aplicación de pantalla completa que no tiene barra de acción.

Además, si utiliza el teclado en un EditText, tenga en cuenta las imeOptions. En modo horizontal, puede obtener un comportamiento de edición de pantalla completa extraño. Esto se puede desactivar mediante el establecimiento de banderas imeOptions que están contenidas en la clase EditorInfo:

 <EditText android:layout_width="@dimen/pin_width" android:layout_height="wrap_content" android:inputType="numberPassword" android:imeOptions="flagNoExtractUi" android:ems="10" android:id="@+id/editTextPIN" android:textSize="@dimen/pin_large_text_size"/> 

https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html

  • Utilizar SystemUiHider para mantener la barra de navegación oculta
  • configuración de vídeo opencv a pantalla completa android
  • Actividad de pantalla completa en Android?
  • ¿Cómo deshacerse del borde superior de desvanecimiento en el modo de pantalla completa de Android?
  • WebView en un fragmento (android.support.v4)
  • ¿Cómo se muestra una aplicación de Android en la pantalla de Google TV en el área de overscan (youtube puede por qué no puedo?)
  • iOS 6 iPhone 5 App no ​​completa en Phonegap Build?
  • Pantalla completa a través de Javascript en Chrome para Android (tablets)
  • Creación de una tostada personalizada a pantalla completa
  • Eliminación de la barra de notificación en una aplicación de Android
  • La barra de título ocultada de Android vuelve
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.