android - full - Mantener modo inmersivo cuando se muestra DialogFragment
fullscreen dialogfragment android (2)
¿Es posible detener el teclado para cambiar el modo de UI?
Tal vez
¿Es posible evitar que la visualización de DialogsFraments cambie el modo UI?
Sí, si solo intentas entender lo que estás haciendo
Si ninguno es posible, ¿por qué la aplicación se queda atascada en el modo de IU incorrecto cuando hay tanto un teclado mostrado como DialogFrament?
debido a la respuesta a la pregunta 2
ahora esta es tu solución general
La vista actual / Enfocada es a quién le quita la configuración de visibilidad de la interfaz de usuario, cuando una Vista está oscurecida o no está en la parte superior con respecto al orden z, entonces setSystemUiVisibility()
se establece en su valor predeterminado. S o mejor intente hackear
View decorView = getWindow().getCurrentFocus() != null ?
getWindow().getCurrentFocus() :getWindow().getDecorView();
y siempre que se DialogFragment
su DialogFragment
revise la línea anterior y vuelva a llamar a sus códigos de acceso a la interfaz de usuario; porque ... supongo que es lúcido hasta este punto
Tengo una aplicación de Android que está hecha usando fragmentos
Estoy ocultando las barras en la parte superior e inferior de la pantalla, usando el siguiente código.
@Override
protected void onResume() {
super.onResume();
isInBackground = false;
if(null == getFragmentManager().findFragmentById(R.id.content_container))
{
getFragmentManager().beginTransaction().add(R.id.content_container,new PresenterFragment(), PresenterFragment.FRAG_TAG).commit();
}
if(Build.VERSION.SDK_INT >=19)
{
View decorView = getWindow().getDecorView();
int uiOptions = 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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
View decorView = getWindow().getDecorView();
int uiOptions = 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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
}
});
}
}
Cuando se muestra el teclado suave que muestran las barras, puedo vivir con esto ya que se ocultan cuando se descarta el teclado. Sin embargo, si se muestra un Fragmento de diálogo mientras se muestra el teclado suave, cuando se descartan tanto el teclado como el fragmento de diálogo permanecer en la parte superior de la aplicación.
Mis 3 preguntas son
¿Es posible detener el teclado para cambiar el modo de UI?
¿Es posible evitar que la visualización de DialogsFraments cambie el modo UI?
editar: solía ver el código a continuación para ver si se muestra el teclado
public static boolean isKeyBoardShown(){
InputMethodManager imm = (InputMethodManager)currentActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isAcceptingText()) {
return true;
} else {
return false;
}
}
-> Sé que hay una solución para los diálogos en una actividad pero no puedo ver uno o volver a trabajar el código para trabajar en un DialogFragment
Si ninguno es posible, ¿por qué la aplicación se queda atascada en el modo de IU incorrecto cuando hay tanto un teclado mostrado como DialogFrament?
1. Explicación de la solución.
He tomado las siguientes citas de los documentos api de Android.
Uso del modo inmersivo de pantalla completa
Cuando el modo inmersivo de pantalla completa está habilitado, su actividad continúa recibiendo todos los eventos táctiles. El usuario puede revelar las barras del sistema con un deslizamiento hacia adentro a lo largo de la región donde normalmente aparecen las barras del sistema. Esto borra el indicador SYSTEM_UI_FLAG_HIDE_NAVIGATION (y el indicador SYSTEM_UI_FLAG_FULLSCREEN, si corresponde) para que las barras del sistema se vuelvan visibles. Esto también activa su View.OnSystemUiVisibilityChangeListener, si está configurado.
En primer lugar, no necesita un OnSystemUiVisibilityChangeListener
cuando usa la inmersión adhesiva.
Sin embargo, si desea que las barras del sistema se oculten automáticamente de nuevo después de unos momentos, puede usar el indicador SYSTEM_UI_FLAG_IMMERSIVE_STICKY. Tenga en cuenta que la versión "adhesiva" de la bandera no desencadena ningún oyente, ya que las barras del sistema que se muestran temporalmente en este modo están en un estado transitorio.
Las recomendaciones para usar inmersión adhesiva / no adhesiva :
Si está creando una aplicación realmente inmersiva, donde espera que los usuarios interactúen cerca de los bordes de la pantalla y no espere que necesiten acceso frecuente a la interfaz de usuario del sistema, use el indicador IMMERSIVE_STICKY junto con SYSTEM_UI_FLAG_FULLSCREEN y SYSTEM_UI_FLAG_HIDE_NAVIGATION. Por ejemplo, este enfoque podría ser adecuado para un juego o una aplicación de dibujo.
Sin embargo, mencionas usuarios que necesitan el teclado, así que sugiero esto:
Use inmersión no pegajosa
Si está creando un lector de libros, un lector de noticias o una revista, use el indicador INMERSIVO junto con SYSTEM_UI_FLAG_FULLSCREEN y SYSTEM_UI_FLAG_HIDE_NAVIGATION. Debido a que los usuarios pueden querer acceder a la barra de acciones y otros controles de la interfaz de usuario con bastante frecuencia, pero no se molestan con ningún elemento de la interfaz de usuario mientras hojean contenido, INMERSIVO es una buena opción para este caso de uso.
2. Solución
Mi solución es configurar tu vista en la onActivityCreated de tus fragmentos.
Mi ejemplo tomado de la muestra ImmersiveModeFragment.java .
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final View decorView = getActivity().getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener(
new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int i) {
hideSystemUI();
}
});
}
Cree un método diferente para administrar la interfaz de OnSystemUiVisibilityChangeListener()
a la que llama desde su OnSystemUiVisibilityChangeListener()
Tomado de aquí inmersión no pegajosa
private void hideSystemUI() {
// Set the IMMERSIVE flag.
// Set the content to appear under the system bars so that the content
// doesn''t resize when the system bars hide and show.
mDecorView.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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
A continuación, puede volver a llamar a este método en onResume
.
onResume(){
hideSystemUI();
}
3. Solución alternativa.
Si la inmersión adhesiva es lo que realmente quieres, debes probar un enfoque diferente.
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
decorView.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);}
}
Espero que esto resuelva tus problemas.