我有一个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>
同样,我的活动中的不同片段有不同的colorPrimary
和colorPrimaryDark
属性样式。
因此,setTheme()
方法不会更改ActionBar
或状态栏的颜色,但它会更改某些内容,例如列表视图中的回调功能的颜色。
我是否遗漏了某些内容,或者我需要为setTheme()
更改ActionBar
和状态栏颜色做些什么?
我尝试了here发布的解决方案,但它给了我与之前尝试过的完全相同的结果(使用setTheme()
)。
答案 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);
。