Android材質:狀態欄顏色不會更改


Answers

雖然不支持在狀態欄上著色<5.0,但您可以在4.4中使用變通辦法來實現較暗的顏色:

使狀態欄半透明

<item name="android:windowTranslucentStatus">true</item>

然後使用AppCompat的工具欄作為你的appbar,確保它適合系統窗口:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    ...
    android:fitsSystemWindows="true"/>

確保將您的工具欄設置為您活動的工具欄:

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

工具欄延伸到狀態欄下方,而狀態欄的半透明狀態使其看起來是較暗的二級顏色。 如果這不是您想要的顏色,則此組合可讓您在狀態欄下方顯示一個視圖,並顯示您所選擇的背景顏色(儘管狀態欄仍然為深色)。

由於4.4只有一種邊緣案例解決方法,但那裡你去。

Question

我正在開發一個簡單的應用程序來測試材料設計。 我使用com.android.support:appcompat-v7:21.0.0 ,我的活動如下所示:

public class MyActivity extends ActionBarActivity {
   ...
}

佈局定義為:

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

現在我按照材料準則定義了我的主題:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary500</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark700</item>
</style>

我想在Android 5之前更改狀態欄顏色並將其設置為colorPrimaryDark但我找不到方法。 我試過使用:

getWindow().setStatusBarColor(..)

但setStatusBar顏色可從級別21獲得。為什麼如果我在主題中定義colorPrimaryDark並使用appcompact,則狀態欄不會更改顏色? 任何人都可以幫忙




切換到AppCompatActivity並在工具欄上添加一個25dp的paddingTop並打開

<item name="android:windowTranslucentStatus">true</item>

然後,將工具欄放在頂部




正如其他人也提到的,可以通過將以下內容添加到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));
    }

但是,我想在此添加的重要一點是,在某些情況下,即使上述內容也不會更改狀態欄顏色。 例如,當為導航抽屜使用MikePenz庫時,它顯然會覆蓋狀態欄顏色,因此您需要手動添加以下內容才能使其工作:

.withStatusBarColorRes(R.color.status_bar_color)




製作Theme.AppCompa t風格的父級

<style name="AppTheme" parent="Theme.AppCompat">
     <item name="android:colorPrimary">#005555</item>
     <item name="android:colorPrimaryDark">#003333</item>
</style>

並在onCreate()放置getSupportActionBar().getThemedContext() onCreate()

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        getSupportActionBar().getThemedContext();
}