teclado samsung idioma funciona detuvo configurar como celular cambiar aparece activar android fullscreen android-4.4-kitkat

android - samsung - no me aparece el teclado en mi celular



Modo de inmersión pegajosa deshabilitado después de que se muestra un teclado suave (4)

Este es el comportamiento normal. Pero puedes arreglarlo en dos pasos:
1. Averiguar cuando el teclado está oculto.
2. Establecer el modo inmersivo de pantalla completa (de nuevo)

El paso 1 es un poco complicado. 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 ); }

Tengo una aplicación que necesita ser de 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 se muestra un teclado virtual para un texto de edición o algo así, cuando el usuario ha terminado con el teclado, el modo inmersivo de pantalla completa no se restaura.

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


Pongo este código en onCreate () observador los cambios de diseño

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int screenHeight = getWindow().getDecorView().getRootView().getHeight(); int keyboardHeight = screenHeight - rect.bottom; if (keyboardHeight > screenHeight * 0.15) { setToImmersiveMode(); } } }); 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); }


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

Si intenta configurar el modo inmersivo demasiado rápido después de que aparezca el teclado virtual, no se ocultará.

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

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); } @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(); } } }

Aquí está la versión de Kotlin:

abstract class ImmersiveAppCompatActivity : AppCompatActivity() { override fun onResume() { super.onResume() setToImmersiveMode() } override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) val runnable = Runnable { setToImmersiveMode() } val handler = Handler(Looper.getMainLooper()) handler.postDelayed(runnable, 300) } private fun setToImmersiveMode() { window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) } }

Ahora, crea tu 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 funcionar en una aplicación de pantalla completa que no tiene barra de acción.

Además, si usa el teclado en un EditText, tenga en cuenta las imeOptions. En modo horizontal puedes obtener un extraño comportamiento de edición de pantalla completa. Esto se puede deshabilitar configurando las 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


Tomado de esta aplicación de ejemplo por Google , debe adjuntar esto al final de su actividad, antes del último corchete final:

@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); // When the window loses focus (e.g. 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. :)