Как скрыть панель навигации системы в 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);
}