Как скрыть панель навигации системы в Android

Я следовал руководству для разработчиков Android: как скрыть панель навигации системы.

int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
          | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);

Это работает нормально, пока я не покажу AlertDialog. Когда отображается диалоговое окно, в верхней части элементов управления приложения отображается панель навигации (три значка: квадрат, треугольник и круг).

3 ответа

Решение

ПРИМЕЧАНИЕ. Система навигации по-прежнему будет отображаться, когда вы показываете какой-либо AlertDialog, но когда вы его отклоняете, он снова скрывается. Если вы все еще не хотите использовать это поведение, используйте Center View для создания Alert-подобного представления.

Вы можете попробовать следующий подход, который я использовал.

/**
     * Hide system NavigationBar and StatusBar
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void hideNavigationBar()
    {
        final View decorView = getWindow().getDecorView();
        decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                Log.i("LOG","Menu Shown is this"+ visibility);
                decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_IMMERSIVE);

            }
        });
    }

Вызовите выше метод из onResume из Activity и убедитесь, что вы переопределяете следующий метод в действии.

@Override
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus)
        {
            getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_IMMERSIVE
                            );
        }
    }

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

public static void showAlert(Context context,String title,String message) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
        alertDialogBuilder.setTitle(title);
        alertDialogBuilder.setMessage(message);
        alertDialogBuilder.setCancelable(false);
        alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });
       final AlertDialog alertDialog = alertDialogBuilder.create();
        //Here's the magic..
//Set the dialog to not focusable (makes navigation ignore us adding the window)
        alertDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);

        alertDialog.show();
        //Set the dialog to immersive
        alertDialog.getWindow().getDecorView().setSystemUiVisibility(
                ((Activity)context).getWindow().getDecorView().getSystemUiVisibility());

//Clear the not focusable flag from the window
       alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    }

Я нашел выше рабочий код из этого SO

Существует решение, начинающееся с KitKat (4.4.2), которое называется Immersive Mode: https://developer.android.com/training/system-ui/immersive.html

По сути, вы должны добавить этот код в ваш метод onResume():

View decorView = getWindow().getDecorView();
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);

Некоторые полезные ссылки: -

1> https://developer.android.com/training/system-ui/navigation.html

2> Как скрыть панель навигации постоянно в андроид активности?

3> Навсегда скрыть панель навигации в действии

4> Скрыть системную панель в планшетах

5> Как скрыть панель навигации в приложении Android?

Надеюсь, это поможет вам.

Используйте эти методы, чтобы показать / скрыть systemUI

  public void hideUI() {
     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 // hide nav bar
        | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
        | View.SYSTEM_UI_FLAG_IMMERSIVE);
  }


  public void showUI() {
      decorView.setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
  }

Попробуй посмотреть есть официальные документы

Другие вопросы по тегам