更改状态栏文本颜色时,主暗为白色

我正试图复制谷歌日历(Google Calendar)应用程序的行为: enter image description here

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

是否有办法改变状态栏文本颜色?

137529 次浏览

我不确定你的目标是什么级别的 API,但是如果你可以使用 API 23特定的东西,你可以添加以下到你的 AppTheme styles.xml:

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

android:windowLightStatusBar设置为 true 时,当状态栏颜色为白色时,可以看到状态栏文本颜色,反之亦然 当 android:windowLightStatusBar设置为 false 时,状态栏文本颜色将被设计为在状态栏颜色为深色时可见。

例如:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!-- Status bar stuff. -->
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightStatusBar">true</item>
</style>

你可以像这个 回答一样通过编程实现

加上这个

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

和前面一样,在我的例子中,SYSTEM _ UI _ FLAG _ LIGHT _ STATUS _ BAR 完成工作,不要忘记设置为高于 API 22。

添加到 setContentView 之后的 oncreate:

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

试试这个。

在活动 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();
}

注意: color _ red-是状态栏的颜色。

很简单:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//  set status text dark
getWindow().setStatusBarColor(ContextCompat.getColor(BookReaderActivity.this,R.color.white));// set status background white

反之亦然:

getWindow().setStatusBarColor(ContextCompat.getColor(BookReaderActivity.this, R.color.black));
View decorView = getWindow().getDecorView(); //set status background black
decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); //set status text  light
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//  set status text dark


getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this,R.color.colorPrimaryDark));// set status background white

对我有用

在活动 onCreate()方法中,将以下代码粘贴到 setContentView(R.layout.activity_generic_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 的回答,我会稍微更新一下,但是是在新的 apis 上。在有主题和夜间主题(黑暗模式)的新 API 中,我会添加 v23/styles.xml 并在其中设置状态栏背景和文本颜色:

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

在 night/styles.xml 中:

<item name="android:statusBarColor" tools:targetApi="l">@color/darkColor</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>

默认的 styles.xml 不包含任何这些代码,或者只包含这些代码,但是请记住不要将其设置为 light:

<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>

通过这种方式,我们为状态栏设置了背景光(和文本颜色) ,但是仅适用于使用 api 23 + 的设备。在设备 < 23的背景将不会改变,因为我认为这是我们不想知道的东西,文本颜色将保持白色。 黑暗主题是在 API 29上添加的,所以我们不必害怕在 API 21上添加黑暗主题;)

但是,这样做的缺点是,我们正在添加另一个需要记住才能管理的文件。

对于任何人在未来期望改变状态栏颜色从白色在一个片段和回到主要的黑暗时,离开片段的最低 api 21 < 23在 Android 使用 Java

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 23 +

这就是:

// deprecated
// WindowInsetsControllerCompat(window, view).isAppearanceLightStatusBars = Boolean
// also deprecated
// ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = Boolean
WindowCompat.getInsetsController(window, decorView)?.isAppearanceLightStatusBars = Boolean

你可以直接从 Activity得到 window

我喜欢把它添加到 Window扩展方法中:

fun Window.setLightStatusBars(b: Boolean) {
WindowCompat.getInsetsController(this, decorView)?.isAppearanceLightStatusBars = b
}

你需要 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.

要使用白色状态栏和黑色文本颜色这样做(Kotlin) :

在主活动的 onCreate函数中添加以下内容

val window: Window = window
WindowInsetsControllerCompat(window,window.decorView).isAppearanceLightStatusBars = true

resoursces/styles.xml中添加这个

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:statusBarColor">#ffffff</item> <!-- this line sets the status bar color (in my case #ffffff is white) -->
<!-- the following lines are not required -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimary</item>
<item name="colorAccent">@color/colorAccent</item>
</style>

这也适用于 API 级别21。

对于 API 21 + ,这对我很有用:

WindowInsetsControllerCompat windowInsetsController =
WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());
windowInsetsController.setAppearanceLightStatusBars(true);

我吸毒

Theme.AppCompat.DayNight

这个代码适用于白天和夜间模式:

getWindow().setStatusBarColor(getWindow().getNavigationBarColor());
WindowInsetsControllerCompat windowInsetsController =
WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());
if ((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_NO)
windowInsetsController.setAppearanceLightStatusBars(true);
else
windowInsetsController.setAppearanceLightStatusBars(false);