簡體   English   中英

在 Android 上更改導航欄圖標顏色

[英]Change navigation bar icon color on Android

我需要更改 android 上的導航欄。就像下圖中右側的“light”變體一樣 https://www.google.co.in/design/spec/layout/structure.html#structure-system-bars中給出的。

現在,我可以使用更改導航欄的背景

"android:navigationBarColor"

我得到

在此處輸入圖像描述

但似乎無法將按鈕顏色更改為深色。

任何人都知道如何去做。

附言:

在 AOSP 中研究負責導航按鈕的類時,我可以找到NavigationBarView.javaPhoneStatusBar.javaPhoneWindowManager.javanavigation_bar.xml

我正在考慮為ic_sysbar_recent之類的導航欄按鈕獲取可繪制對象的引用並更改它們的色調。 但這些都是私人的,我無法獲得他們的參考。

另外,我看到有人使用 xposed 庫來做L-NAVBAR ,但我不想使用任何外部庫。

如果您使用的是API 27(Android 8.1)或更高版本,則可以在主題中實現此目的:

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

您可以創建一個名為values-v27的文件夾,並使用燈光導航欄和上面的代碼放置主題版本(在styles.xml中)以獲取暗導航欄按鈕。
這樣,使用Android 8.0或更低版本的用戶將獲得標准(黑色)導航欄,而使用Android 8.1或更高版本的用戶將獲得帶有暗按鈕的白色導航欄。

從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

您可以調整windowLightNavigationBar = true/falsenavigationBarColor = @color/yourColorId

所以有 4 種情況,我做了一個實驗:

簡而言之,您不希望windowLightNavigationBar= falsenavigationBarColor=White

要么

windowLightNavigationBar= truenavigationBarColor=Black (這將在某些設備上連接)

在此處輸入圖像描述

如果您的目標用戶 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 的用戶無法享受這些功能

    // 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);
}

據我所知,這些圖標是com.android.systemui的一部分,這就是為什么你需要root + patch或者注入(比如Xposed)才能改變它們。

從不同的角度考慮它。 一種可能性可能是將該活動的主題設置為亮或暗,然后以編程方式設置條的背景顏色。 其中一個主題應該有黑色圖標。

另一種選擇可能是完全隱藏條形圖https://developer.android.com/training/system-ui/navigation.html

然后使用您自己的按鈕在底部創建第二個工具欄。

只需在應用程序運行時添加這一行就可以了

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM