Android setTheme() 不改变 ActionBar 和状态栏

Android setTheme() not changing ActionBar and Status Bar

我有一个 ActionBarActivity,其中包含导航抽屉的片段。当按下导航抽屉中的项目时,它会启动相应的片段。 在每个片段中,onCreate() 方法如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().setTheme(R.style.AppTheme);

    setHasOptionsMenu(true);
}

然而,每个片段所应用的主题都不同。

我注意到 setTheme() 方法似乎没有更改 ActionBar 或状态栏的颜色,正如我在引用的 styles.xml 中声明的那样:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/brand_red_primary</item>
    <item name="colorPrimaryDark">@color/brand_red_primaryDark</item>
    <item name="android:actionBarStyle">@style/AppTheme.ActionBarStyle</item>
</style>

同样,我的 activity.

中的不同片段有不同的样式,具有不同的 colorPrimarycolorPrimaryDark 属性

因此,setTheme() 方法不会更改 ActionBar 或状态栏的颜色,但会更改某些内容,例如列表视图中的回调功能的颜色。

我是不是遗漏了什么,或者我需要做些什么才能 setTheme() 更改 ActionBar 和状态栏的颜色?

更新:

我尝试了发布 here 的解决方案,但它给我的结果与我之前尝试的完全相同(使用 setTheme())。

您可以通过定义自定义样式来更改操作栏的背景颜色、文本颜色。

编辑项目中的styles.xml文件

<resources>
<!-- the theme applied to the application or activity -->
<style name="CustomActionBarTheme"
       parent="@style/Theme.AppCompat">
    <item name="android:actionBarStyle">@style/MyActionBar</item>
    <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
    <item name="android:actionMenuTextColor">@color/actionbar_text</item>

    <!-- Support library compatibility -->
    <item name="actionBarStyle">@style/MyActionBar</item>
    <item name="actionBarTabTextStyle">@style/MyActionBarTabText</item>
    <item name="actionMenuTextColor">@color/actionbar_text</item>
</style>

<!-- ActionBar styles -->
<style name="MyActionBar"
       parent="@style/Widget.AppCompat.ActionBar">
    <item name="android:titleTextStyle">@style/MyActionBarTitleText</item>

    <!-- Support library compatibility -->
    <item name="titleTextStyle">@style/MyActionBarTitleText</item>
</style>

<!-- ActionBar title text -->
<style name="MyActionBarTitleText"
       parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
    <item name="android:textColor">@color/actionbar_text</item>
    <!-- The textColor property is backward compatible with the Support Library -->
</style>

<!-- ActionBar tabs text -->
<style name="MyActionBarTabText"
       parent="@style/Widget.AppCompat.ActionBar.TabText">
    <item name="android:textColor">@color/actionbar_text</item>
    <!-- The textColor property is backward compatible with the Support Library -->
</style>
</resources>

然后使用 setTheme() 设置 CustomActionBarTheme

了解更多信息check here

此外,如果您正在尝试实施 material 主题,请执行以下操作,它适用于您评论的图片中提到的地方

<style name="AppTheme" parent="AppTheme.Base"/>

<style name="AppTheme.Base" parent="Theme.AppCompat.NoActionBar">

    <!-- ...and here we setting appcompat’s color theming attrs -->
    <!-- colorPrimary is used for the default action bar background -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <!-- colorPrimaryDark is used for the status bar -->
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <!-- colorAccent is used as the default value for colorControlActivated
     which is used to tint widgets -->
    <item name="colorAccent">@color/colorAccent</item>

</style>

我的应用程序使用 AppTheme(..通常在清单中指定..如下)

    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    ..
    android:theme="@style/AppTheme">

我决定使用以下方法来解决我的问题:

private void updateActionBar(int title, int actionBarColor, int statusBarColor) {
    if (title != 0) {
        getSupportActionBar().setTitle(getString(title));
        getSupportActionBar().setSubtitle(null);
    }


    if (actionBarColor != 0) {
        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(actionBarColor)));
    }


    if (statusBarColor != 0) {
        if (Build.VERSION.SDK_INT >= 21) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().setStatusBarColor(getResources().getColor(statusBarColor));
        }
    }

}

我在更改Fragment之前一直在调用此方法,但也一直在[=11=的onCreate方法中使用getActivity().setTheme(R.style.AppTheme);getActivity().setTheme(R.style.AppTheme_colourTwo); ].

你需要在 super.onCreate(..) 之前调用 setTheme(..),它对我有用:

setTheme(R.style.YourThemeName);
super.onCreate(savedInstanceState);