Android 当primaryDark为白色时更改状态栏文本颜色

Android 当primaryDark为白色时更改状态栏文本颜色,android,android-styles,android-statusbar,Android,Android Styles,Android Statusbar,我试图重现Google日历应用程序的行为: 但是我还没有找到改变状态文本颜色的方法。如果我将colorPrimaryDark设置为白色,我就看不到状态栏的图标和文本,因为它们的颜色也是白色的 有没有办法更改状态栏文本的颜色 提前感谢我不确定您的目标API级别,但是如果您可以使用API 23特定的内容,您可以将以下内容添加到AppTheme styles.xml中: <item name="android:statusBarColor">@color/colorPrimaryDark

我试图重现Google日历应用程序的行为:

但是我还没有找到改变状态文本颜色的方法。如果我将colorPrimaryDark设置为白色,我就看不到状态栏的图标和文本,因为它们的颜色也是白色的

有没有办法更改状态栏文本的颜色


提前感谢

我不确定您的目标API级别,但是如果您可以使用API 23特定的内容,您可以将以下内容添加到AppTheme styles.xml中:

<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightStatusBar">true</item>

您可以像这样通过编程实现

再加上这个

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

如前所述,在我的例子中,系统\ UI \标志\灯\状态\栏完成了工作,不要忘记设置为高于API 22

将此添加到setContentView之后的oncreate:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
试试这个


在activity
onCreate()
方法中,粘贴以下代码

try {
        if (android.os.Build.VERSION.SDK_INT >= 21) {
                Window window = getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_red));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
注意:红色-是状态栏的颜色。

非常简单:

getWindow().getDecorView().setSystemMivibility(视图、系统、UI、标志、灯、状态栏);//将状态文本设置为黑色
getWindow().setStatusBarColor(ContextCompat.getColor(BookReaderActivity.this,R.color.white));//将状态背景设置为白色
反之亦然:

getWindow().setStatusBarColor(ContextCompat.getColor(BookReaderActivity.this,R.color.black));
View decorView=getWindow().getDecorView()//将状态背景设置为黑色
decorView.SetSystemMiviability(decorView.getSystemUiVisibility()&~View.SYSTEM\u UI\u FLAG\u LIGHT\u STATUS\u BAR)//设置状态文本灯

它对我有效

在您的活动
onCreate()
方法中,将以下代码粘贴到
setContentView(R.layout.activity\u generic\u main)之后

下面是示例代码

public class GenericMain extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_generic_main);
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

    }
}

如果不是启动页面,试试这个

getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getActivity().getWindow().setNavigationBarColor(ContextCompat.getColor(context, R.color.white));
getActivity().getWindow().setStatusBarColor(ContextCompat.getColor(context, R.color.white));

按照@Jon的回答,我会稍微更新一下,但会使用新的API。在具有主题和夜间主题(暗模式)的新API上,我将添加v23/styles.xml并在其中设置状态栏背景和文本颜色:

@color/lightColor
真的
在夜间/styles.xml中:

<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightStatusBar">true</item>
@color/darkColor
假的
default styles.xml不包含任何以下代码,或者仅包含以下代码,但请记住不要将其设置为“轻”:

?attr/colorPrimaryVariant

通过这种方式,我们可以为状态栏设置灯光背景(和文本颜色),但仅适用于具有api 23+的设备。在设备上对于将来希望在片段中以编程方式将状态栏颜色从白色更改为黑色,并在使用Java的android中为最小api 21<23保留片段时将状态栏颜色更改为黑色的任何人

private void updateStatusBar(boolean isEnter){

    Window window = requireActivity().getWindow();

    int color = ContextCompat.getColor(requireActivity(),R.color.colorAlertDialog);

    if(isEnter) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        else
            clearDecorFlags(window);
    }
    else {
        color = ContextCompat.getColor(requireActivity(),R.color.colorPrimaryDark);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            window.getDecorView().setSystemUiVisibility(window.getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        else
            clearDecorFlags(window);
    }
    window.setStatusBarColor(color);
}

private void clearDecorFlags(Window window){
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
}

人们仍然没有得到API级别21+的正确答案(通常甚至更低)。
这是:

科特林:

WindowInsetsControllerCompat(<window>, <view>).isAppearanceLightStatusBars = Boolean

为此,您需要
androidx.core
,因此kotlin的情况有所不同

//for Dark status bar icon with white background

    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
            getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.white))    
    
             
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv())
            getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.black))

 // for dark background and light theme colours of icon.

如果我的api级别是21,那么它不起作用。你能告诉我替代方案吗?任何针对api 21的解决方案。请帮助?注意:android:windowLightStatusBar需要API级别23(当前最小值为21)以上。。。(⌘F1)对于api 21,这是不可能的。在谷歌应用程序中,它是一个黑条而不是白条。请参阅本文了解API级别<23:这需要API级别23+。问题是状态栏的文本颜色,而不是状态栏背景。SetSystemMivibility不推荐使用
new WindowInsetsControllerCompat(<window>, <view>).setAppearanceLightStatusBars(boolean)
Window window = Activity.getWindow();
View view = window.getDecorView();
//for Dark status bar icon with white background

    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)
            getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.white))    
    
             
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv())
            getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.black))

 // for dark background and light theme colours of icon.