3

У меня есть приложение для Android, который производится с использованием фрагментовПоддерживать Immersive режим при DialogFragment показан

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

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

Когда экранная клавиатура это показано бруски показать, что я могу жить с этим, как они скрываются, когда клавиатура dismissed.However если диалоговое фрагмент шоу в то время как мягкая клавиатура показана тогда, когда обе клавиатуры и фрагмент диалога отклоняется, они остаются в верхней части приложения.

Мои 3 вопросы

Можно ли остановить softkeyboard для изменения режима пользовательского интерфейса?

Возможно ли прекратить показ диалоговых окон DialogsFraments при изменении режима пользовательского интерфейса?

редактировать: Я использовал ниже код, чтобы увидеть, если клавиатура показана

public static boolean isKeyBoardShown(){ 
    InputMethodManager imm = (InputMethodManager)currentActivity.getSystemService(Context.INPUT_METHOD_SERVICE); 
    if (imm.isAcceptingText()) { 
     return true; 
    } else { 
     return false; 
    } 
} 

-> Я знаю, что есть работа вокруг диалогов в деятельности, но я не могу увидеть один или переделки код для работы в DialogFragment

Если не возможно, почему приложение застряло в неправильном режиме пользовательского интерфейса, когда есть как показанная клавиатура, так и DialogFrament?

+0

Вы хотите, чтобы приложение всегда находилось в полноэкранном режиме и чтобы управлять, когда отображается мягкая клавиатура? –

+0

Да, это правильно –

+0

Я отправляю ответ –

ответ

22

1. Объяснение для решения.

Я привел следующие цитаты из андроидов api docs.

Using Immersive Full-Screen Mode

Когда режим погружения полноэкранного включен, активность продолжает получать все события прикосновения. Пользователь может выявить системные полосы с внутренним проводом вдоль области, где обычно появляются системные панели. Это очищает флаг SYSTEM_UI_FLAG_HIDE_NAVIGATION (и флаг SYSTEM_UI_FLAG_FULLSCREEN, если применяется), поэтому системные полосы становятся видимыми. Это также запускает ваш View.OnSystemUiVisibilityChangeListener, если он установлен.

Во-первых, при использовании липкого погружения вам не нужен OnSystemUiVisibilityChangeListener.

Однако, если вы хотите, чтобы система баров автоматически скрывать снова через несколько минут, вы можете вместо этого использовать флаг в SYSTEM_UI_FLAG_IMMERSIVE_STICKY. Обратите внимание, что «липкая» версия флага не вызывает никаких прослушивателей, так как временные полосы системы , показанные в этом режиме, находятся в переходном состоянии.

recommendations for using sticky/non sticky immersion:

Если вы создаете действительно захватывающее приложение, где вы ожидаете пользователь взаимодействуют между собой вблизи краями экрана, и вы не ожидаете их требует частого доступа к пользовательскому интерфейсу системы, используйте флаг IMMERSIVE_STICKY в сочетании с SYSTEM_UI_FLAG_FULLSCREEN и SYSTEM_UI_FLAG_HIDE_NAVIGATION. Например, этот подход может быть подходит для игры или приложения для рисования.

Однако вы упоминаете пользователей, нуждающихся в помощи клавиатуры, так что я предлагаю это:
Use Non-Sticky Immersion

Если вы строите чтения электронных книг, для чтения новостей или журнал, используйте Immersive флаг в сочетании с SYSTEM_UI_FLAG_FULLSCREEN и SYSTEM_UI_FLAG_HIDE_NAVIGATION. Поскольку пользователи могут часто обращаться к панели действий и другим элементам пользовательского интерфейса несколько раз, но не должны быть , которые обеспокоены любыми элементами пользовательского интерфейса при перелистывании содержимого, IMMERSIVE - хороший вариант для этого варианта использования.


2. Решение

Мое решение создать свой вид пользовательского интерфейса в onActivityCreated ваших фрагментов.

Мой пример взято из 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(); 
       } 
      }); 
} 

Создать отдельный метод для управления пользовательского интерфейса, который вы называете от вашего OnSystemUiVisibilityChangeListener()

Взяты отсюда non sticky immersion

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

Вы можете вызвать этот метод снова onResume.

onResume(){ 
    hideSystemUI(); 
} 

3. Альтернативные решения.

Если липкое погружение - это то, что вы действительно хотите, вам нужно попробовать другой подход.

For sticky immersion

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

Я надеюсь, что это решает ваши проблемы.

+0

Если у вас возникли проблемы с клавиатурой после этого, дайте мне знать. У меня есть код для управления этим. –

+1

Ваше альтернативное решение решило проблему, с которой я боролся в течение нескольких часов. Спасибо! – MScott

+1

@MScott, пожалуйста! Этот сайт спас меня от многих подобных битв. Я рад, что это помогло и спасибо за эту обратную связь :) –

2

Возможно ли остановить программную клавиатуру для изменения режима пользовательского интерфейса?

Может

Можно ли остановить показ DialogsFraments от изменения режима пользовательского интерфейса?

Да, если только вы пытаетесь понять, что вы делаете

Если ни возможно почему приложение застревает в неправильном режиме пользовательского интерфейса, когда существует как показано клавиатура и DialogFrament?

из ответа на вопрос 2

теперь это ваше общее решение

Ток/Focused View есть кто ОС принимает параметры видимости UI из, когда View затемняется или нет сверху по отношению к z-порядку, то setSystemUiVisibility() установлен по умолчанию. S о вместо того, чтобы попытаться взлом вокруг

View decorView = getWindow().getCurrentFocus() != null ? 
       getWindow().getCurrentFocus() :getWindow().getDecorView(); 

и всякий раз, когда ваш DialogFragment уволен чек на строку выше и повторно вызвать ваших доступность коду Ui; потому что .... догадка понятна до этого момента

0

Это исправление, а также еще одно исправление, связанное с мягкой клавиатурой, входит в класс DialogFragment из этой библиотеки. Просто продлить это вместо стандартной библиотеки:

https://github.com/marksalpeter/contract-fragment

Основные задачами библиотеки является добавление функции делегата на фрагменты и DialogFragments, которые используют отношения фрагмент родителя/ребенок, но вы можете просто использовать исправление ошибок или скопируйте/вставьте файл