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?
- ¿Cómo deshacerse del borde superior de desvanecimiento en el modo de pantalla completa de Android?
- Cómo ocultar la barra de navegación de forma permanente en la actividad android?
- Vídeo de pantalla completa sin relación de aspecto de rotura
- Cómo escalar un mapa de bits de más de 4096 píxeles?
- Ver Android-Video en Pantalla Completa
- Problema con la barra de notificación en la aplicación de pantalla completa
- Botón de pantalla completa de Video dentro de WebView no funciona
- Aplicación de pantalla completa android
- Actividad de pantalla completa en Android?
- Eliminación de la barra de notificación en una aplicación de Android
- Samsung Galaxy S8 modo de pantalla completa
- Creación de una tostada personalizada a pantalla completa
- Pantalla completa a través de Javascript en Chrome para Android (tablets)
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