Android setTheme()不会更改ActionBar和状态栏

时间:2015-04-08 18:43:42

标签: android android-fragments navigation-drawer android-theme android-styles

我有一个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>

同样,我的活动中的不同片段有不同的colorPrimarycolorPrimaryDark属性样式。

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

我是否遗漏了某些内容,或者我需要为setTheme()更改ActionBar和状态栏颜色做些什么?

UPDATE:

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

修改项目中的 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

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

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

答案 2 :(得分:1)

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

In [58]: d
Out[58]: {4: 14, 7: 8, 9: 10}

我在更改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的{​​{1}}方法中继续使用getActivity().setTheme(R.style.AppTheme);getActivity().setTheme(R.style.AppTheme_colourTwo);