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

nkhmeac6  于 2023-01-11  发布在  Android
关注(0)|答案(7)|浏览(353)

I need to change the navigation bar on android. Just like the 'light' variant on the right in the image below

as given in https://www.google.co.in/design/spec/layout/structure.html#structure-system-bars.
现在,我可以使用以下命令更改导航栏的背景
第一个月
我得到

但是似乎没有办法把按钮颜色改成深色。
任何人都知道怎么做。
附言:
在AOSP中研究负责导航按钮的类时,我可以找到NavigationBarView.javaPhoneStatusBar.javaPhoneWindowManager.javanavigation_bar.xml
我在考虑为ic_sysbar_recent这样的导航栏按钮获取可绘制对象的引用并更改它们的色调。但这些是私有的,我无法获取它们的引用。
此外,我还看到有人使用L-NAVBAR的暴露库来做这件事,但我不想使用任何外部库。

ycl3bljg

ycl3bljg1#

如果您使用的是API 27(Android 8.1)或更高版本,您可以在主题中使用此功能:

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

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

laik7k3q

laik7k3q2#

从Android O开始,它变得非常简单,你可以:

View.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);

要使此操作生效,窗口必须请求FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,而不是FLAG_TRANSLUCENT_NAVIGATION。
文件:https://developer.android.com/reference/android/view/View.html#SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR

kqlmhetl

kqlmhetl3#

您可以调整windowLightNavigationBar = true/falsenavigationBarColor = @color/yourColorId
一共有4个案例,我做了个实验:
简而言之,您不需要windowLightNavigationBar= false,而navigationBarColor=White

windowLightNavigationBar= truenavigationBarColor=Black(这将在某些设备上连接)

bmvo0sr5

bmvo0sr54#

如果您的目标用户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的用户不能享受这些特征

rfbsl7qr

rfbsl7qr5#

如果你正在寻找一个简单的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);
}
vddsk6oq

vddsk6oq6#

活动中

导航栏图标-深色

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

导航栏图标-白色

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

在片段中

导航栏图标-深色

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

导航栏图标-白色

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

l7mqbcuq7#

只需添加这一行,您可以在应用程序运行时

val navView: BottomNavigationView = findViewById(R.id.nav_view)
    navView.itemIconTintList = null

相关问题