Android 设置应用的底部导航栏(虚拟按键)背景颜色

Android手机机型种类繁多,但是虚拟按键也就是底部的导航栏,不外乎两种设计方式,一种是作为虚拟按键设计到屏幕内部,一种是作为系统按键设计到屏幕外面。



对于按键在屏幕内部的机型,因为虚拟按键也是屏幕内容的一部分,它也实际占据屏幕一定的高度,在系统应用中虚拟按键默认呈现的都是透明的背景色,但是在用户应用中如果未设置虚拟按键的背景颜色,它默认呈现的多为黑色。


但是我们可能会看到有些App为了统一自己的风格样式,标题栏和底部的虚拟按键的颜色是一致的,他们是怎么实现的呢?


状态栏和标题栏的颜色设置可以通过theme主题来控制,这里不做介绍了,下面说一下如何改变底部虚拟按键的背景颜色:

在Window类中有一个方法可以设置虚拟按键的背景颜色

public abstract void setNavigationBarColor(@ColorInt int color);
大家看到了这是一个抽象方法,那么Window的子类有没有实现这个方法呢,Window有一个子类PhoneWindow它实现了父类所有的抽象方法
@Override
    public void setNavigationBarColor(int color) {
        mNavigationBarColor = color;
        mForcedNavigationBarColor = true;
        if (mDecor != null) {
            mDecor.updateColorViews(null, false /* animate */);
            mDecor.updateNavigationGuardColor();
        }
    }
这便是修改手机虚拟按键背景颜色的实现方法了
我们如何得到PhoneWindow对象呢?

//在Activity中有这样一个Api:
public Window getWindow() {
    return mWindow;
}
这个mWindow对象在Activity的attach方法中进行了实例化:
final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config, String referrer, IVoiceInteractor voiceInteractor,
            Window window) {
        attachBaseContext(context);

        mFragments.attachHost(null /*parent*/);

        mWindow = new PhoneWindow(this, window);
        //....省略若干行       
    }
mWindow正是PhoneWindow的实例,到此我们就可以在Activity中改变系统虚拟按键的背景颜色了
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().setNavigationBarColor(Color.parseColor("#1bb5d7"));
            //getWindow().setNavigationBarColor(getResources().getColor(R.color.black));
            //getWindow().setNavigationBarColor(Color.BLUE);
}
这里有一个系统版本的判断,因为setNaviationBarColor(int color)这个Api是在API Level 21才出现的,即Android 5.0及以上的机型才可以使用该Api。 (API Level与Android版本对照表)
由于我们一个项目中可能会有很多Activity,所以建议把修改虚拟按键的逻辑放在抽取的BaseActivity的onCreate()方法中。

Android Studio中设置底部导航栏需要以下步骤: 1. 首先,在你的项目中打开`res`文件夹,然后右键点击`res`文件夹,选择`New -> Android Resource File`创建一个新的资源文件。 2. 在弹出的对话框中,输入文件名并选择`Navigation`作为文件类型,然后点击`OK`按钮。 3. 接下来,在导航图编辑器中,右键点击左侧的空白区域,选择`New Destination`来添加目标页面。 4. 在弹出的对话框中,选择要添加的目标页面的类型,并填写相关信息,然后点击`OK`按钮。可以根据需要添加多个目标页面。 5. 在导航图编辑器中,选择要设置底部导航栏的目标页面,然后点击右侧的三个点图标,选择`Set start destination`选项来设置该页面为起始页面。 6. 在主活动(MainActivity)布局文件中,添加一个`BottomNavigationView`控件作为底部导航栏。例如: ```xml <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottomNavigationView" android:layout_width="match_parent" android:layout_height="wrap_content" app:menu="@menu/nav_menu" /> ``` 7. 创建一个菜单资源文件(如`nav_menu.xml`),并在其中定义底部导航栏的菜单项。例如: ```xml <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/navigation_home" android:icon="@drawable/ic_home" android:title="Home" /> <item android:id="@+id/navigation_dashboard" android:icon="@drawable/ic_dashboard" android:title="Dashboard" /> <item android:id="@+id/navigation_notifications" android:icon="@drawable/ic_notifications" android:title="Notifications" /> </menu> ``` 8. 在主活动(MainActivity)中,找到底部导航栏控件,并为其设置导航图资源文件和导航选项的选中监听器。例如: ```java BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); NavigationUI.setupWithNavController(bottomNavigationView, navController); ``` 现在,你已经成功设置底部导航栏。运行你的应用程序,你将看到底部导航栏显示在屏幕底部,并且可以切换不同的页面。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值