首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓M光明和黑暗状态栏编程-如何使它再次黑暗?

安卓M光明和黑暗状态栏编程-如何使它再次黑暗?
EN

Stack Overflow用户
提问于 2016-06-07 07:16:05
回答 15查看 65.1K关注 0票数 64

在Android M中,我们有能力使状态栏图标变黑。为此,我们可以在主题的xml中指定属性:

代码语言:javascript
运行
复制
<item name="android:windowLightStatusBar">true</item>

或者我们用以下代码在运行时设置它:

代码语言:javascript
运行
复制
View someView = findViewById(R.id.some_view);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    someView.setSystemUiVisibility(someView.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}

它真的很好用。但是问题是如何在运行时正确地将状态栏模式设置为黑暗?

我已经尝试过这些变体:

代码语言:javascript
运行
复制
// Makes status bar mode dark, but also hides it along with all navigation views. 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() | ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

// Does nothing 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

// Also does nothing 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

那么,如何才能以正确的方式做到这一点呢?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2016-09-20 14:26:06

@Aracem发布的解决方案是有效的,但是,如果尝试更改状态栏的背景色,则无效。在我的例子中,我是这样做的。

要启用windowLightStatusBar(例如,在Utils类中以编程方式):

代码语言:javascript
运行
复制
 public static void setLightStatusBar(View view,Activity activity){


            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

                int flags = view.getSystemUiVisibility();
                flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
                view.setSystemUiVisibility(flags);
                activity.getWindow().setStatusBarColor(Color.WHITE); 
            }
}

若要将StatusBar还原到以前的状态,请执行以下操作:

代码语言:javascript
运行
复制
  public static void clearLightStatusBar(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Window window = activity.getWindow();
            window.setStatusBarColor(ContextCompat
                 .getColor(activity,R.color.colorPrimaryDark)); 
        }
    }

恢复状态栏的颜色就足够了,它还可以还原图标的颜色。非常重要:在setLightStatusBar中使用的视图(视图.)之前,还原操作不会发生从屏幕上删除(即view.getVisibility()==GONE|INVISIBLE)。

票数 65
EN

Stack Overflow用户

发布于 2016-07-11 16:57:38

根据尼克·布彻的“格子”计划

代码语言:javascript
运行
复制
public static void clearLightStatusBar(@NonNull View view) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int flags = view.getSystemUiVisibility();
        flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
        view.setSystemUiVisibility(flags);
    }
}

您可以找到这个文件这里

票数 52
EN

Stack Overflow用户

发布于 2018-07-26 06:41:45

我基于@Aracem和@Carlos Hernández Gil,但我认为如果我们使用位异或 (^运算符),将很容易理解。

代码语言:javascript
运行
复制
private void setLightStatusBar(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int flags = activity.getWindow().getDecorView().getSystemUiVisibility(); // get current flag
        flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;   // add LIGHT_STATUS_BAR to flag
        activity.getWindow().getDecorView().setSystemUiVisibility(flags); 
        activity.getWindow().setStatusBarColor(Color.GRAY); // optional
    }
}

private void clearLightStatusBar(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int flags = activity.getWindow().getDecorView().getSystemUiVisibility(); // get current flag
        flags = flags ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; // use XOR here for remove LIGHT_STATUS_BAR from flags
        activity.getWindow().getDecorView().setSystemUiVisibility(flags);
        activity.getWindow().setStatusBarColor(Color.GREEN); // optional
    }
}

解释

首先,看看SYSTEM_UI_FLAG_LIGHT_STATUS_BARsetSystemUiVisibility

代码语言:javascript
运行
复制
/**
 * Flag for {@link #setSystemUiVisibility(int)}: Requests the status bar to draw in a mode that
 * is compatible with light status bar backgrounds.
 */
public static final int SYSTEM_UI_FLAG_LIGHT_STATUS_BAR = 0x00002000;

public void setSystemUiVisibility(int visibility) {
    if (visibility != mSystemUiVisibility) {
        mSystemUiVisibility = visibility;
        ...
    }
}

我认为下面的2行代码很难理解

代码语言:javascript
运行
复制
flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; // for set light status bar
flags = flags ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; // for clear light status bar

乍一看,我只是觉得我们可以用简单的

代码语言:javascript
运行
复制
flags = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; // for set light status bar
flags = 0; // for clear light status bar (0 <=> LIGHT_STATUS_BAR <=> default systemUiVisibility)

但是我们应该使用|^,因为

例如,我们希望同时设置状态栏和导航栏,然后我们将使用

代码语言:javascript
运行
复制
flags = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
activity.getWindow().getDecorView().setSystemUiVisibility(flags);

当我们不希望状态栏不再轻的时候,我们可以使用

代码语言:javascript
运行
复制
flags = View.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
activity.getWindow().getDecorView().setSystemUiVisibility(flags);

代码语言:javascript
运行
复制
flags = activity.getWindow().getDecorView().getSystemUiVisibility();
flags = flags ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; 
activity.getWindow().getDecorView().setSystemUiVisibility(flags);

为了更多地了解为什么我们使用|^,我认为下面的教程可能会帮助https://medium.com/@JakobUlbrich/flag-attributes-in-android-how-to-use-them-ac4ec8aee7d1这里是我的理解。希望能帮上忙

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37672833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档