Android材质:状态栏颜色不会改变

Fra*_*ola 54 android statusbar material-design

我正在开发一个简单的应用来测试材料设计.我正在使用com.android.support:appcompat-v7:21.0.0,我的活动看起来像:

public class MyActivity extends ActionBarActivity {
   ...
}
Run Code Online (Sandbox Code Playgroud)

布局定义为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MyActivity">

    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="128dp"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimaryDark"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

现在我按照材料指南定义了我的主题:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary500</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark700</item>
</style>
Run Code Online (Sandbox Code Playgroud)

我想在Android 5之前更改状态栏颜色并将其设置为colorPrimaryDark但我无法找到方法.我试过用:

getWindow().setStatusBarColor(..)
Run Code Online (Sandbox Code Playgroud)

但是,从第21级开始可以使用setStatusBar颜色.为什么如果我colorPrimaryDark在我的主题中定义并使用appcompact,状态栏不会改变颜色?有人可以帮忙吗?

Ale*_*ood 62

状态栏是操作系统拥有的系统窗口.在5.0之前的Android设备上,应用程序无权更改其颜色,因此这不是AppCompat库可以支持旧平台版本的内容.AppCompat可以做的最好的事情就是为ActionBar应用程序中的常用UI小部件着色提供支持.

  • 知道为什么这对5.0.1不起作用吗? (11认同)

Tom*_*Tom 62

虽然不支持着色状态栏<5.0,但在4.4中你可以使用一种解决方法来获得更暗的颜色:

使状态栏保持半透明状态

<item name="android:windowTranslucentStatus">true</item>
Run Code Online (Sandbox Code Playgroud)

然后使用AppCompat的工具栏为您的appbar,确保它适合系统窗口:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    ...
    android:fitsSystemWindows="true"/>
Run Code Online (Sandbox Code Playgroud)

确保将工具栏设置为活动的工具栏:

protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)

工具栏延伸到状态栏下方,状态栏的半透明度使其看起来是较暗的二级颜色.如果这不是您想要的颜色,这个组合允许您在状态栏下方放置一个视图,该视图具有您选择的背景颜色(尽管状态栏仍然显得较暗).

由于4.4只有一种边缘情况解决方法,但是你去了.


use*_*953 39

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    getWindow().setStatusBarColor(getResources().getColor(R.color.actionbar));
}
Run Code Online (Sandbox Code Playgroud)

将此代码放在Activity的onCreate方法中.这对我有帮助.


小智 13

正如其他人也提到过的,可以通过将以下内容添加到Activity的onCreate()来轻松解决:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.primary_dark));
    }
Run Code Online (Sandbox Code Playgroud)

但是,我想在这里添加的重点是,在某些情况下,即使上面也不会改变状态栏颜色.例如,当使用MikePenz库导航抽屉时,它会明确地覆盖状态栏颜色,因此您需要手动添加以下内容才能使其工作:

.withStatusBarColorRes(R.color.status_bar_color)


Anu*_*kur 10

AppCompat v7:21.0.0不支持状态栏着色.

来自Android开发者博客文章

在较旧的平台上,AppCompat尽可能模拟颜色主题.目前,这仅限于为操作栏和一些小部件着色.

这意味着AppCompat lib将仅对Lollipop及更高版本上的状态栏进行着色.


alv*_*lof 8

切换到AppCompatActivity并在工具栏上添加25 dp paddingTop并打开

<item name="android:windowTranslucentStatus">true</item>
Run Code Online (Sandbox Code Playgroud)

然后,将工具栏放在顶部

  • 这将适用于API 19+仅适用于上述不起作用 (2认同)