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.
中的不同片段有不同的样式,具有不同的 colorPrimary
和 colorPrimaryDark
属性
因此,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);
我有一个 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.
中的不同片段有不同的样式,具有不同的colorPrimary
和 colorPrimaryDark
属性
因此,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);