android系统定制开发动态显示隐藏虚拟按键虚拟导航Navigationbar

本文介绍了一种在Android系统中删除或动态显示隐藏虚拟导航按键的方法。通过在XML资源配置和代码中设置config_showNavigationBar为false,以及使用SystemProperties控制,可以实现按键的隐藏。为了方便功能的添加和移除,作者选择在开发者选项中添加开关,通过数据库字段控制虚拟按键的显示状态,并在PhoneStatusBar.java中实现动态调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新需求:删除Android 原生自带的虚拟导航按键(暂定)


如想直接删除不显示Navigationbar,可以用如下两个方法

1)在资源xml文件中把导航按键的高度和宽度设置为0

frameworks/base/core/res/res/values/dimens.xml  
    <dimen name="navigation_bar_height">0dp</dimen>
    <!-- Height of the bottom navigation bar in portrait; often the same as @dimen/navigation_bar_height -->
    <dimen name="navigation_bar_height_landscape">0dp</dimen>


2)PhoneWindowManager.java中会在开机后检测如下两个prop来查看是否需要实现

在配置文件中设置config_showNavigationBar=false
frameworks/base/core/res/res/values/config.xml设置为false
SystemProperties.get("qemu.hw.mainkeys");1为关,0为开

源码判断方法

mHasNavigationBar = res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
	// Allow a system property to override this. Used by the emulator.
	// See also hasNavigationBar().
	String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
	if ("1".equals(navBarOverride)) {
		mHasNavigationBar = false;
	} else if ("0".equals(navBarOverride)) {
<think>我们正在讨论在Android11隐藏导航栏(NavigationBar)的问题。根据提供的引用,我们可以找到几种方法。在Android中,导航栏通常指的是屏幕底部的虚拟按键(如返回键、主页键、最近任务键)。隐藏导航栏可以让应用进入沉浸式模式,提供更大的屏幕空间。根据引用[3],我们可以使用`setSystemUiVisibility`方法来隐藏导航状态栏。但是需要注意的是,在Android11(API级别30)中,`setSystemUiVisibility`方法已经被废弃,推荐使用`WindowInsetsController`。因此,在Android11及更高版本中,我们应该使用新的API来实现隐藏导航栏。下面我将提供两种方法:1.使用新的`WindowInsetsController`API(推荐,适用于Android11及更高版本)2.使用旧的`setSystemUiVisibility`方法(兼容较低版本,但注意在Android11中已废弃)方法一(推荐):在Activity中,我们可以通过获取窗口的`WindowInsetsController`来控制系统栏的显示。隐藏导航栏的代码:```javaif(Build.VERSION.SDK_INT>=Build.VERSION_CODES.R){//Android11(API30)及更高版本ViewdecorView=getWindow().getDecorView();WindowInsetsControllercontroller=decorView.getWindowInsetsController();if(controller!=null){//隐藏导航栏controller.hide(WindowInsets.Type.navigationBars());//设置导航栏行为:当用户滑动屏幕边缘时暂时显示,然后自动隐藏controller.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);}}else{//旧版本Android(API30以下)ViewdecorView=getWindow().getDecorView();intuiOptions=View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;decorView.setSystemUiVisibility(uiOptions);}```方法二(兼容旧版本):对于旧版本,我们仍然可以使用`setSystemUiVisibility`,但需要注意在Android11中该方法已被废弃,所以我们可以通过条件判断来使用。上面的代码中已经包含了旧版本的实现。另外,根据引用[1][2]中的内容,我们还需要注意以下几点:-隐藏导航栏后,当用户与屏幕交互时(例如触摸屏幕),导航栏可能会重新出现。我们可以使用`IMMERSIVE_STICKY`标志来使导航栏在短暂出现后自动隐藏。-在隐藏导航栏的同时,我们可能也需要隐藏状态栏(即全屏模式),但这不是必须的,可以根据应用需求决定。此外,我们还需要考虑键盘的出现。在引用[1]中提到,当软键盘出现时,可能会影响沉浸式模式。因此,我们需要测试在输入时导航栏的行为。最后,我们可以在Activity的`onResume`方法中调用上述代码,以确保每次回到Activity时都保持隐藏导航栏。示例代码(在Activity的onResume中调用):```java@OverrideprotectedvoidonResume(){super.onResume();hideNavigationBar();}privatevoidhideNavigationBar(){//使用上面方法一中的代码}```注意:在Android11中,新的`WindowInsetsController`提供了更精细的控制,包括导航栏、状态栏输入法(IME)等系统栏的显示隐藏。总结:在Android11隐藏导航栏,推荐使用新的`WindowInsetsController`API,同时为了兼容旧版本,可以结合条件判断使用旧方法。§§相关问题§§1.如何在Android11隐藏状态栏?2.如何让应用的内容显示在导航栏后面(即全屏显示,但导航栏覆盖在内容上)?3.在Android中,沉浸式模式全屏模式有什么区别?4.如何监听导航栏的显示隐藏事件?</think>### Android 11 隐藏导航栏的实现方法 在 Android 11 (API 30) 中隐藏导航栏(Navigation Bar),推荐使用新的 `WindowInsetsController` API,替代已废弃的 `setSystemUiVisibility()` 方法。以下是完整实现步骤: #### 方法一:使用 WindowInsetsController(推荐) ```java // 在 Activity 的 onCreate 或 onResume 中调用 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { final WindowInsetsController controller = getWindow().getInsetsController(); if (controller != null) { // 隐藏导航栏 controller.hide(WindowInsets.Type.navigationBars()); // 设置隐藏行为:滑动屏幕边缘时临时显示 controller.setSystemBarsBehavior( WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE ); } } ``` #### 方法二:兼容旧版本(API < 30) ```java View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; decorView.setSystemUiVisibility(uiOptions); ``` #### 关键注意事项: 1. **权限声明** 在 `AndroidManifest.xml` 中添加全屏权限: ```xml <activity android:name=".MainActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> </activity> ``` 2. **行为模式** - `BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE`:滑动边缘时临时显示(推荐) - `BEHAVIOR_SHOW_BARS_BY_TOUCH`:触摸屏幕时显示 - `BEHAVIOR_DEFAULT`:系统默认行为 3. **恢复显示处理** 当导航栏临时显示后,系统会自动隐藏。如需手动控制: ```java // 重新隐藏导航栏 controller.hide(WindowInsets.Type.navigationBars()); ``` 4. **键盘交互** 软键盘弹出时可能显示导航栏,需在 `onConfigurationChanged()` 中重新调用隐藏方法[^1]。 > **实测效果**:导航栏将被完全隐藏,用户从屏幕底部上滑可临时呼出导航栏,松手后自动隐藏(沉浸式体验)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值