Intereting Posts
Android: как показывать диалог или активность по экрану блокировки Переходите к Как реализовать Swipe в Android-игре без просмотра Android – отключить поддержку экрана x больших экранов Android-клавиатура не отображается в эмуляторе Как перехватить аудиопоток на устройстве Android? Android – Предотвращение удаления данных приложения или файлов через параметр «Очистить данные» Android в чем разница между Android Support Repository и Android Support Library vs Google Repository vs Google Play Services Активность, перемещающаяся снизу вверх, но фоновая активность не должна перемещаться Калькулятор sw600dp не работает на вкладке Galaxy Многоадресная рассылка UDP с мобильного на ПК Как я могу узнать, какую версию поддержки Android версии v4 я использую? Android Studio stale APK для варианта сборки после изменения xml Менеджер Android SDK, только показывает установленный пакет Можно ли создать фиксированную ширину в XML?

Принудительный режим погружения отключен после показа мягкой клавиатуры

У меня есть приложение, которое в большинстве случаев должно быть полноэкранным. Я знаю, что если отображается предупреждение или отображается другое окно, в верхней части окна действия полный экран временно удаляется. К сожалению, когда мягкая клавиатура отображается для EditText или что-то еще, когда пользователь закончил работу с клавиатурой, полноэкранный режим погружения не восстанавливается.

Есть идеи, как это можно достичь?

Solutions Collecting From Web of "Принудительный режим погружения отключен после показа мягкой клавиатуры"

Взятый из этого примера приложение Google , вы должны добавить это к концу своей деятельности, перед последней конечной скобкой:

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

И ты должен быть хорошим. 🙂

Это нормальное поведение. Но вы можете исправить это в два этапа:
1. Узнайте, когда клавиатура скрыта
2. Установите режим полноэкранного погружения (снова)

Шаг 1 немного сложнее. Вы можете проверить мой ответ здесь:
https://stackoverflow.com/a/27567074/2525452

Шаг 2 прост:

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

Я предлагаю расширить AppCompatActivity в новый класс (ImmersiveAppCompatActivity). Делая это, любая деятельность, которую вы создаете с использованием этого класса, будет иметь встроенный режим погружения.

Если вы попытаетесь установить режим погружения слишком быстро после появления мягкой клавиатуры, он не скроется.

Также обратите внимание, что обработчик был улучшен путем переключения на статический обработчик – это предотвратит утечки, если пользователь покинет активность до того, как 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); // 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(); } } } 

Теперь создайте свою активность с помощью этого класса:

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

Я тестировал это в Android 5.1 и 7.0 для работы в полноэкранном приложении, у которого нет панели действий.

Кроме того, если вы используете клавиатуру в EditText, знаете о imeOptions. В ландшафтном режиме вы можете получить странное поведение редактирования в полноэкранном режиме. Это можно отключить, установив флаги imeOptions, которые содержатся в классе 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