在安卓中动态设置状态栏颜色

11

如何动态设置应用程序的状态栏颜色,在水平滑动时使用视图页面,状态栏颜色、标题栏和按钮应该改变颜色。根据我的代码,标题和按钮颜色可以完美地更改,但问题是状态栏颜色从数组列表中获取下一个颜色。有人能帮我解决这个问题吗?以下是我的代码

 private int[] colors = new int[]{0xffffd200, 0xff37beb7, 0xff00ccff, 0xff8585c1, 0xfff2a03c, 0xff2a80b9, 0xfff15972,
        0xffe9776c, 0xff9dcc96,0xff76c069};

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = ((Activity) context).getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

        int coloring = position % colors.length;
        int new_color = colors[coloring];
        window.setStatusBarColor(new_color);
        title_bar.setBackgroundColor(new_color);
        set_share.setBackgroundColor(new_color);

    }
    else{

        int color = position % colors.length;
        itemView.setBackgroundColor(colors[color]);
        title_bar.setBackgroundColor(colors[color]);
        set_share.setBackgroundColor(colors[color]);
    }

3个回答

22

要更改状态栏颜色,请使用setStatusBarColor(int color)方法。根据javadoc文档,我们还需要在窗口上设置一些标志。

以下是可工作的代码片段:

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(activity.getResources().getColor(R.color.example_color));

以下内容取自以下参考资料: 如何在Lollipop [Android]中更改状态栏颜色以匹配应用程序?


设置状态栏颜色对我来说不是问题,但标题栏和按钮的颜色与状态栏的颜色不同,尽管我传递的是相同的颜色,如何解决这个问题。我希望所有颜色都应该相同。 - developer
对于按钮,可以使用 useButton11.setBackgroundColor(getResources().getColor(R.color.example_color); 而对于标题栏,您可以使用两种方法:1. requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.mytitle); 2. 如果您正在使用 "ToolBar",则可以直接设置 mToolbar.setBackground()。 - androgo
兄弟,我不知道你是否理解我的问题。如上所述,我的代码运行良好,但问题是例如{红色,绿色,蓝色,黄色}在滑动页面标题栏和按钮时,标题栏和按钮会变成红色,而状态栏会变成(下一个颜色)绿色,我不知道问题出在哪里。 - developer
好的,当您使用SwipeViews或ViewPager时,它会初始化其前一个片段和下一个片段,因此当您从一个视图页面切换到另一个视图页面时,状态栏将为状态栏提供上一个已初始化片段的值。只需在用户到达时使用变量设置颜色即可。 - androgo
所以它将解决您的问题,只需获取当前ViewPager并仅根据其更改颜色即可。 - androgo
完美运行。@androgo感谢您之前的留言。我已根据您之前的评论解决了我的问题。 - developer

8

谈到状态栏颜色,你只能将其添加到API级别大于21的设备中。对于满足此条件的设备,您可以根据以下示例动态更改StatusBar颜色。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        window.setStatusBarColor(getResources().getColor(R.color.Statusbar));
    }

2
当我想要设置状态栏颜色时,我使用了https://github.com/jgilfelt/SystemBarTint。我是这样使用的:
public static void colorStatusBar(Window window, Activity activity) {
    Log.v(Constants.LOG_TAG, "Start defining color bar status");
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {      
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        SystemBarTintManager tintManager = new SystemBarTintManager(activity);
        tintManager.setStatusBarTintEnabled(true);

        tintManager.setTintColor(activity.getResources().getColor(R.color.colorPrimaryDark));
    }
}

请注意,设置状态栏颜色仅在运行API >= 19的手机上才可能。


1
这段代码只适用于KitKat,因为有那个“if”语句。 - rupinderjeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接