Навсегда скрыть панель навигации в действии
Можно ли навсегда удалить панель навигации в действии? Я хочу удалить панель с кнопками, которые появляются на кнопке экрана на планшете, а не на панели действий. Здесь
Я знаю, что делать это не рекомендуется, я не принимал это решение, но мне нужно это сделать. На моем макете есть еще одна кнопка, чтобы покинуть активность. Остальная часть моего приложения может иметь и имеет панель навигации.
Я нашел этот код и немного его адаптировал. Проблема в том, что даже когда я скрываю панель навигации, остается черное пространство позади. Я думаю, система рассчитывает размер экрана с учетом панели навигации?
public static class Content extends ImageView implements View.OnSystemUiVisibilityChangeListener, View.OnClickListener, ActionBar.OnMenuVisibilityListener {
Activity mActivity;
TextView mTitleView;
Button mPlayButton;
SeekBar mSeekView;
boolean mAddedMenuListener;
boolean mMenusOpen;
boolean mPaused;
boolean mNavVisible;
int mLastSystemUiVis;
Runnable mNavHider = new Runnable() {
@Override public void run() {
setNavVisibility(false);
}
};
public Content(Context context, AttributeSet attrs) {
super(context, attrs);
setOnSystemUiVisibilityChangeListener(this);
setOnClickListener(this);
}
public void init(Activity activity, TextView title, Button playButton,
SeekBar seek) {
// This called by the containing activity to supply the surrounding
// state of the video player that it will interact with.
mActivity = activity;
mTitleView = title;
mPlayButton = playButton;
mSeekView = seek;
mPlayButton.setOnClickListener(this);
setPlayPaused(true);
}
@Override protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (mActivity != null) {
mAddedMenuListener = true;
mActivity.getActionBar().addOnMenuVisibilityListener(this);
}
}
@Override protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mAddedMenuListener) {
mActivity.getActionBar().removeOnMenuVisibilityListener(this);
}
}
@Override public void onSystemUiVisibilityChange(int visibility) {
// Detect when we go out of nav-hidden mode, to clear our state
// back to having the full UI chrome up. Only do this when
// the state is changing and nav is no longer hidden.
int diff = mLastSystemUiVis ^ visibility;
mLastSystemUiVis = visibility;
if ((diff&SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0
&& (visibility&SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
setNavVisibility(true);
}
}
@Override protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
// When we become visible or invisible, play is paused.
setPlayPaused(true);
}
@Override public void onClick(View v) {
if (v == mPlayButton) {
// Clicking on the play/pause button toggles its state.
setPlayPaused(!mPaused);
} else {
// Clicking elsewhere makes the navigation visible.
setNavVisibility(true);
}
}
@Override public void onMenuVisibilityChanged(boolean isVisible) {
mMenusOpen = isVisible;
setNavVisibility(true);
}
void setPlayPaused(boolean paused) {
mPaused = paused;
mPlayButton.setText(paused ? R.string.play : R.string.pause);
setKeepScreenOn(!paused);
setNavVisibility(true);
}
void setNavVisibility(boolean visible) {
int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| SYSTEM_UI_FLAG_LAYOUT_STABLE;
if (!visible) {
newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
| SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}
// If we are now visible, schedule a timer for us to go invisible.
if (visible) {
Handler h = getHandler();
if (h != null) {
h.removeCallbacks(mNavHider);
if (!mMenusOpen && !mPaused) {
// If the menus are open or play is paused, we will not auto-hide.
h.postDelayed(mNavHider, 1500);
}
}
}
// Set the new desired visibility.
setSystemUiVisibility(newVis);
mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE);
mPlayButton.setVisibility(visible ? VISIBLE : INVISIBLE);
mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE);
}
}
9 ответов
AFAIK, это невозможно без прав root. Было бы проблемой безопасности иметь приложение, которое не может быть закрыто с помощью системных кнопок.
Изменить, см. Здесь: Скрыть системную панель в планшетах
Существует решение, начинающееся с 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);
Вы можете
Есть два способа (оба требуют наличия устройства root):
1- Во-первых, откройте устройство в adb window command
и затем выполните следующее:
adb shell >
su >
pm disable com.android.systemui >
и чтобы вернуть его, просто сделайте то же самое, но измените disable
в enable
,
2- второй способ, добавьте следующую строку в конец файла build.prop вашего устройства:
qemu.hw.mainkeys = 1
затем, чтобы вернуть его, просто удалите его.
и если вы не знаете, как редактировать файл build.prop:
- загрузите EsExplorer на свое устройство и найдите build.prop, затем измените его права на чтение и запись, добавьте строку.
- Загрузите специализированное приложение-редактор build.prop, например build.propEditor.
- или обратитесь к этой ссылке.
Вы можете скрыть панель навигации, просто вызовите этот метод на вашем onCreate()
,
public void FullScreencall() {
if(Build.VERSION.SDK_INT < 19){
View v = this.getWindow().getDecorView();
v.setSystemUiVisibility(View.GONE);
} else {
//for higher api versions.
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
}
}
Это скроет всю панель нагий. Надеюсь, это поможет вам
После просмотра видео DevBytes (от Романа Нурика) и прочтения самой последней строки в документации, где говорится:
Примечание. Если вам нравится режим автоматического скрытия IMMERSIVE_STICKY, но вам также необходимо показать свои собственные элементы управления пользовательским интерфейсом, просто используйте IMMERSIVE в сочетании с Handler.postDelayed() или что-то подобное, чтобы повторно войти в режим погружения через несколько секунд.
Ответ, который дал radu122, работал для меня. Просто установите обработчик, и вам будет хорошо.
Вот код, который работает для меня:
@Override
protected void onResume() {
super.onResume();
executeDelayed();
}
private void executeDelayed() {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// execute after 500ms
hideNavBar();
}
}, 500);
}
private void hideNavBar() {
if (Build.VERSION.SDK_INT >= 19) {
View v = getWindow().getDecorView();
v.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);
}
}
Google говорит "через несколько секунд" - но я хочу предоставить эту функциональность как можно скорее. Возможно я изменю значение позже, если мне придется, я обновлю этот ответ.
Измените тему в своем манифесте.
Если вы хотите скрыть панель навигации для одного действия, вы можете использовать это:
<activity
android:name="Activity Name"
android:theme="@android:style/Theme.Black.NoTitleBar"
android:label="@string/app_name" >
Если вы хотите скрыть панель навигации для всего приложения, вы можете использовать это:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Black.NoTitleBar" >
Мое решение, чтобы скрыть только панель навигации:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
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_STICKY);
}
}
});
}
@Override
protected void onResume() {
super.onResume();
final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
final View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(uiOptions);
}
Начните с скрытия в OnResume() действия, а затем продолжайте скрывать, как показано ниже:
decorView.setOnSystemUiVisibilityChangeListener
(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
// Note that system bars will only be "visible" if none of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
//visible
hideSystemUI();
}
}
}
});`
public 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.
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);
}
Из документации Google:
Вы можете скрыть панель навигации на Android 4.0 и выше, используя флаг SYSTEM_UI_FLAG_HIDE_NAVIGATION. Этот фрагмент скрывает как панель навигации, так и строку состояния:
View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
http://developer.android.com/training/system-ui/navigation.html