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?

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

  • ¿Cómo puedo hacer que mi cuadro de diálogo de Android sea de pantalla completa?
  • La barra de título ocultada de Android vuelve
  • Reproductor de video en pantalla completa - mediacontroller detrás de la barra de navegación
  • Cómo configurar la actividad en modo de pantalla completa en Android?
  • Cómo iframe un video de youtube en HTML para teléfonos Android para poder ver y rotar a pantalla completa?
  • WebView en un fragmento (android.support.v4)
  • Android: Cuando veo una pantalla completa de video de youtube presiono atrás y el final de Actividad
  • Videoview de pantalla completa sin alargar el video
  • El video IFRAME incorporado sigue reproduciéndose en segundo plano después de salir de la pantalla completa en Android
  • android webview muestra youtube.com/tv video en pantalla completa
  • ¿Por qué aparece la barra de navegación en las aplicaciones de pantalla completa cuando se hace clic en el menú emergente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.