在 Android 上更改导航栏图标的颜色

我需要更改机器人的导航栏。就像下面图片右边的“光”变体一样 如 https://www.google.co.in/design/spec/layout/structure.html#structure-system-bars所示。

现在,我可以通过使用

"android:navigationBarColor"

我明白

enter image description here

但是似乎没有办法把按钮的颜色改成深色。

谁都知道该怎么做。

附注:

在研究 AOSP 中负责导航按钮的类时,我可以找到 JavaPhoneStatusBar.javaPhoneWindowManager.java导航 _ bar. xml

我正在考虑获取像 ic_sysbar_recent这样的导航栏按钮的绘图参考,并改变它们的色彩。但这些是私人的,我不能得到他们的参考。

此外,我看到有人使用暴露的库来做 L-NAVBAR,但我不想使用任何外部库。

61364 次浏览

从 Android O 开始,它变得非常简单,你只需要:

View.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);

为了使其生效,窗口必须请求 FLAG _ DRAWS _ system _ Bar _ back 但不是 FLAG _ TRANSLUCENT _ Navigation。

文件: https://developer.android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR

如果你使用的是 API 27(Android 8.1)或更高版本,你可以在你的主题中使用这个:

<item name="android:windowLightNavigationBar">true</item>

您可以创建一个名为 值 -v27的文件夹,并将主题的一个版本(在 styles.xml 中)与一个浅色导航栏和上面的代码放在一起,以获得深色导航栏按钮。
这样,Android 8.0或更低版本的用户将获得标准(黑色)导航栏,而 Android 8.1或更高版本的用户将获得带有黑色按钮的白色导航栏。

如果您的目标用户 Api 级别为27或更高,只需在 AppTheme 中使用此行即可

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="android:windowBackground">@color/your_color</item>
</style>

但是如果您的目标用户 api 级别小于27或更高,您可以使用这些行

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="android:windowBackground">@color/your_color</item>
<item name="android:windowLightNavigationBar" tools:targetApi="27">true</item>
</style>

通过这样做,API 级别为27或更高的用户可以改变 BottomNav 图标的颜色,但 API 级别小于27的用户不能享受这些特性

你可以调整 windowLightNavigationBar = true/falsenavigationBarColor = @color/yourColorId

有四个案例,我做了个实验:

简而言之,你不想 windowLightNavigationBar= falsenavigationBarColor=White

或者

windowLightNavigationBar= truenavigationBarColor=Black (这将连接到一些设备上)

enter image description here

只需添加这一行,你是确定的,而应用程序正在运行

val navView: BottomNavigationView = findViewById(R.id.nav_view)
navView.itemIconTintList = null
    // IF your want code in Activity :


// if you want navigation-bar icon color drak.


getWindow().setNavigationBarColor(getContext().getResources().getColor(R.color.white));
View view = getWindow().getDecorView();
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);


// if you want navigation-bar icon color white.


getWindow().setNavigationBarColor(getContext().getResources().getColor(R.color.black));
View view = getWindow().getDecorView();
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    



// IF your want code in Fragment :


// if you want navigation-bar icon color drak.


getActivity().getWindow().setNavigationBarColor(getContext().getResources().getColor(R.color.white));
View view = getActivity().getWindow().getDecorView();
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);


// if you want navigation-bar icon color white.


getActivity().getWindow().setNavigationBarColor(getContext().getResources().getColor(R.color.black));
View view = getActivity().getWindow().getDecorView();
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}

如果您正在寻找一个简单的 java 方法

public static void setStatusBarColor(Activity A , int color , int color2 , boolean darkIcon) {
   

if (A != null && !A.isFinishing()) {


Window window = A.getWindow();


window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);


window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
           

if(darkIcon){
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
}else {
window.getDecorView().setSystemUiVisibility(0);
}


window.setStatusBarColor(ContextCompat.getColor(A, color));
window.setNavigationBarColor(ContextCompat.getColor(A,color2));


}
}

内部活动

  @Override
protected void onDestroy() {
super.onDestroy();
C.setStatusBarColor(this ,R.color.bg , R.color.navcolor ,false);
}


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
C.setStatusBarColor(this ,R.color.bg , R.color.bg,true);
setContentView(R.layout.activity_teams_players);
}