Android 永久隐藏活动中的导航栏
是否可以永久删除活动上的导航栏?我想删除平板电脑屏幕按钮上的按钮栏,而不是操作栏 我知道不建议这样做,我没有做出这个决定,但我需要这样做。在我的布局中,有另一个按钮用于退出活动。我的应用程序的其余部分可以也确实有导航栏 我找到了这段代码,并对其进行了一些修改。问题是,即使我隐藏了导航栏,也会留下一个黑色的空间。我猜系统计算屏幕大小时考虑了导航栏Android 永久隐藏活动中的导航栏,android,hide,navigationbar,Android,Hide,Navigationbar,是否可以永久删除活动上的导航栏?我想删除平板电脑屏幕按钮上的按钮栏,而不是操作栏 我知道不建议这样做,我没有做出这个决定,但我需要这样做。在我的布局中,有另一个按钮用于退出活动。我的应用程序的其余部分可以也确实有导航栏 我找到了这段代码,并对其进行了一些修改。问题是,即使我隐藏了导航栏,也会留下一个黑色的空间。我猜系统计算屏幕大小时考虑了导航栏 public static class Content extends ImageView implements View.OnSystemUiVisi
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);
}
}
更改清单中的主题 如果要隐藏某个活动的导航栏,可以使用以下选项:
<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" >
如果要隐藏整个应用程序的导航栏,可以使用以下选项:
<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" >
AFAIK,如果没有root访问权限,这是不可能的。这将是一个安全问题,能够有一个应用程序,不能退出与系统按钮
编辑,请参见此处:有一个从KitKat(4.4.2)开始的解决方案,称为沉浸式模式: 基本上,您应该将以下代码添加到onResume()方法中:
你可以 有两种方法(都需要设备根目录): 1-首先,在
adb窗口命令中打开设备,然后运行以下操作:
adb shell >
pm disable-user --user 0 com.android.systemui >
要恢复它,只需执行相同的操作,但将禁用
更改为启用
2-第二种方法是,在设备的build.prop文件末尾添加以下行:
qemu.hw.mainkeys = 1
然后要把它拿回来,就把它取下来
如果您不知道如何编辑build.prop文件:
- 在设备上下载并搜索build.prop,然后更改其读写权限,最后添加行
- 下载专门的build.prop编辑器应用程序,如
- 或参考
在观看了DevBytes(由Roman Nurik创作)并阅读了文档中最后一行内容后,其中写道:
注意:如果您喜欢IMMERSIVE_STICKY的自动隐藏行为,但也需要显示自己的UI控件,只需使用IMMERSIVE与Handler.postdayed()结合使用,或类似的方法,几秒钟后重新进入IMMERSIVE模式
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);
}
}
谷歌说“几秒钟后”——但我想尽快提供这个功能。可能我以后会更改该值,如果有必要,我会更新此答案。您可以隐藏导航栏,只需在onCreate()上调用此方法即可
public void FullScreencall(){
如果(Build.VERSION.SDK_INT<19){
视图v=this.getWindow().getDecorView();
v、 设置系统兼容性(View.GONE);
}否则{
//对于更高的api版本。
View decorView=getWindow().getDecorView();
int uiOptions=View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.设置系统兼容性(uiOptions);
}
}
这将隐藏整个nagiation面板。希望它能帮助您从Google文档中获得帮助:
您可以使用SYSTEM_UI_FLAG_hide_导航标志隐藏Android 4.0及更高版本上的导航栏。
此代码段隐藏了导航栏和状态栏:
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);
先隐藏在活动的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);
}
我的解决方案(仅隐藏导航栏)是:
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);
}
我想删除导航栏,而不是操作栏。我想隐藏平板电脑屏幕底部的按钮。嗨,史蒂夫,这些答案有一些阅读理解上的问题。每个人都希望您删除操作栏。哈哈。你有没有想过在4.0及以上版本中使用它?谢谢你知道com.android.systemui有哪些功能吗?@JohnyTex是的,它是安全的,因为它只处理UI而不是系统核心,关于软导航按钮,它们根本不存在,因为它们主要存在于导航栏中。这应该是选择的答案,我将为这个ans添加更多的可用性later@meditat是的,这是正确的,都需要root,我会根据我删除之前的评论来编辑我的答案。方法1适用于Polestar 2仿真器,我必须重新启动仿真器。您如何使用此代码?@steve我有一个问题,我的活动根布局是RelativeLayout,它有一个设置为android:layout_alignParentBottom=“true”的子视图,导航栏消失,但子视图不会移动到屏幕的下边缘,如果导航栏设置为“不可见”而不是“消失”,您是否可以帮助?嗨,无论如何,在显示关键字“打字”的网络视图中,在输入焦点后隐藏按钮?评论应该说//更高APIs@Evish谢谢,但我有一个问题,我的活动根布局是RelativeLayout,它有一个子视图设置为android:layout\u alignParentBottom=“true”,导航栏消失,但子视图不会移动到屏幕的下边缘,就好像导航栏设置为不可见而不是消失一样,你能帮忙吗?我正在安卓8.0设备上测试,您从哪里获得getWindow()
?在我的结尾,它说:*无法读取符号getWindow()。*如果它来自片段,请尝试getActivity().getWindow()
。这是最可怕的方法,但谷歌建议以这种方式使用。。他们真的不能提供一个很好的方法吗?我和你在一起真是个白痴。也许这个平台现在提供了一个更好的解决方案。恐怕没有……我目前正在努力寻找,但没有办法……只是谷歌在提供真正有用的apisHmm方面花了太多时间,因为这个平台非常好,而且有很好的文档记录。但是有些功能很难实现,或者很难看,你是对的。@MartinPfeffer谢谢