我有一个ActionBarActivity其中有导航抽屉的片段。当按下导航抽屉中的某个项目时,它会启动相应的片段。在每个片段中,该onCreate()方法如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().setTheme(R.style.AppTheme);
setHasOptionsMenu(true);
}
Run Code Online (Sandbox Code Playgroud)
然而,每个片段所应用的主题都不同。
我注意到该方法似乎没有更改我引用的 中声明的 或 状态栏setTheme()的颜色:ActionBarstyles.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>
Run Code Online (Sandbox Code Playgroud)
同样,我的活动中的不同片段有不同的样式colorPrimary和不同的属性。colorPrimaryDark
因此,该setTheme()方法不会更改状态ActionBar栏或状态栏的颜色,但它确实会更改一些内容,例如列表视图中回拉功能的颜色。
我是否遗漏了什么,或者我需要做什么来setTheme()更改ActionBar状态栏颜色?
我尝试了此处发布的解决方案,但它给出的结果与我之前尝试过的结果完全相同(使用setTheme())。
android android-theme android-fragments navigation-drawer android-styles
在具有可配置主题的应用程序中,如何设置app:popupTheme才能匹配整体主题?
我使用 Android Studio 的向导创建了一个带有导航抽屉的应用程序。然后,我修改了此代码以添加一个复选框,用于在运行时在深色主题和浅色主题之间进行选择并调用setTheme活动。完整的代码可以在此 github 存储库中找到。
在 中app/src/main/res/values/styles.xml,Android Studio 生成了以下内容:
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>\nRun Code Online (Sandbox Code Playgroud)\n\n中使用的这种样式app/src/main/res/layout/app_bar_main.xml,也是由Android Studio生成的:
<android.support.v7.widget.Toolbar\n android:id="@+id/toolbar"\n android:layout_width="match_parent"\n android:layout_height="?attr/actionBarSize"\n android:background="?attr/colorPrimary"\n app:popupTheme="@style/AppTheme.PopupOverlay"/>\nRun Code Online (Sandbox Code Playgroud)\n\n该app:popupTheme属性决定“\xe2\x8b\xae”菜单使用的样式。使用浅色主题时这看起来是正确的,但是当我在运行时将应用程序切换到深色主题时,菜单的颜色错误。我知道我可以改变AppTheme.PopupOverlay\ 的父母,如下所示:
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"/>\nRun Code Online (Sandbox Code Playgroud)\n\n使其在深色主题中工作,但当浅色主题处于活动状态时,菜单看起来错误。
\n\n让菜单的颜色动态适应应用程序的整体主题(无论是深色还是浅色)的正确方法是什么?应该app:popupTheme动态改变吗?AppTheme.PopupOverlay\ 的父级应该动态更改吗?还有别的事吗?
我有一个问题,SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR不知何故无法工作,但SYSTEM_UI_FLAG_LIGHT_STATUS_BAR正在工作。我目前正在使用 Android API 28。
那么发生了什么?在 API 23 及以下版本上,我按预期获得半透明状态栏和导航栏。在 API 23 和 API API 26 之间,我按预期获得了半透明的导航栏和灯光模式状态栏。但是在 API 27 及更高版本上,我获得了 Light Mode Status Bar 而不是 Light Mode Navigation Bar。它只是普通的黑色,没有任何变化。
这是我的 MainActivity 和我的代码,用于根据 Android API 级别启用半透明或浅色模式状态栏和导航栏(注意我的评论描述了哪些有效,哪些无效):
View decorView = getWindow().getDecorView();
Window win = getWindow();
//Setup Status Bar and Nav Bar white if supported
if(Build.VERSION.SDK_INT >= 27) {
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);// <- works not
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); // <- works
}
else if (Build.VERSION.SDK_INT >= 23 && Build.VERSION.SDK_INT < 27) {
//this here works …Run Code Online (Sandbox Code Playgroud) 我有一个测试多模块项目,有些模块看不到我的应用程序主题。更详细地说,模块如下:应用程序、公共、主页和详细信息。
应用程序模块包含一个活动和导航,公共部分包含字符串,样式和主页/详细信息包含一个虚拟片段。所有片段都实现了包含我的风格的公共模块。
// Modules
implementation project(path: ':navigation')
implementation project(path: ':common')
Run Code Online (Sandbox Code Playgroud)
因此,当我转到活动的布局编辑器并尝试从预览中更改主题时,我可以看到并选择我的主题。

当然,当我运行应用程序时,样式可以按预期工作,唯一的问题是预览不起作用。这是公共模块上的主题:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.Leanback.Browse">
<!-- Theme.AppCompat compatibility: -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<!-- Theme.MaterialComponents compatibility: -->
<item name="colorPrimary">#171717</item>
<item name="colorPrimaryVariant">#212121</item>
<item name="colorAccent">#DD1C1A</item>
<item name="colorOnPrimary">#eeeeee</item>
<item name="colorSecondary">#FFEB3B</item>
<item name="colorSecondaryVariant">#FFC107</item>
<item name="colorOnSecondary">#eeeeee</item>
<item name="colorSurface">#2196F3</item>
<item name="colorOnSurface">#eeeeee</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
我在试验和错误期间观察到的一件事是,如果我将主题父级从 Leanback 更改为 Theme.AppCompat,预览可以工作,但我不能这样做,因为我需要 Leanback。最后,除了app模块之外的所有模块都是库模块apply plugin: 'com.android.library'
我的设置是 Windows 10 PC,使用的是 Android studio 4 canary 8。我也在 Android studio 4 canary 2 上进行了测试,结果相同。
编辑:解决方案在模块清单上设置默认主题,感谢@Martin …
我已按如下方式设置我的应用程序:
构建.gradle
implementation 'com.google.android.material:material:1.1.0'
样式文件
<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
<item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
<item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>
<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
<item name="android:color">@color/colorPrimary</item>
</style>
<style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
<item name="android:color">@color/colorPrimary</item>
</style>
Run Code Online (Sandbox Code Playgroud)
CheckoutFragment.kt
private fun createConfirmOrderDialog() {
val builder = AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme)
builder.setTitle(getString(R.string.confirm_order))
.setMessage(dialogPrompt)
.setPositiveButton(R.string.confirm) { dialog, _ ->
viewModel.placeOrder()
dialog.dismiss()
}
.setNegativeButton(R.string.cancel) { dialog, _ ->
dialog.dismiss()
}
builder.show()
}
Run Code Online (Sandbox Code Playgroud)
颜色文件
<color name="colorAccent">#F1CB1A</color> // I have this added to the base theme
但是,此设置显示了一个对话框,其中按钮文本不可见,因为文本和背景都是白色的。
我怎样才能解决这个问题?
android android-theme android-alertdialog android-ktx material-components-android
我想知道是否可以(以及如何)自定义现有主题.
我正在寻找的是如何检索某个属性(即颜色)并在Activity启动时更改它并重新应用之前修改过的主题setContentView().
与之类似setTheme(),但不使用资源ID,而是使用修改后的主题.
我按照这里的答案:StackOverflow:如何更改android中tabhost的字体大小
它确实有效,但我失去了Holo主题,而是获得了一个旧的默认主题.所以我尝试了以下方法:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Holo.NoActionBar.Fullscreen">
<!-- API 14 theme customizations can go here. -->
<item name="android:tabWidgetStyle">@style/CustomHoloTabWidget</item>
</style>
<style name="CustomHoloTabWidget" parent="@android:style/Widget.TabWidget">
<!-- Custom item for text appearance -->
<item name="android:textAppearance">@style/CustomTabWidgetText</item>
<!-- End -->
<item name="android:tabStripLeft">@null</item>
<item name="android:tabStripRight">@null</item>
<item name="android:tabStripEnabled">false</item>
<item name="android:divider">?android:attr/dividerVertical</item>
<item name="android:showDividers">middle</item>
<item name="android:dividerPadding">8dip</item>
<item name="android:measureWithLargestChild">true</item>
<!-- Following line results in ERROR -->
<item name="android:tabLayout">@android:layout/tab_indicator_holo</item>
<!-- End -->
</style>
<!-- Custom text appearance item definition -->
<style name="CustomTabWidgetText" parent="@android:style/TextAppearance.Widget.TabWidget">
<item name="android:textSize">36sp</item>
<item name="android:textStyle">bold</item>
</style>
<!-- End -->
Run Code Online (Sandbox Code Playgroud)
基本上我所做的是编辑Widget.Holo.Tabwidget的原始定义, …
我怎样才能获得Holo Spinner轻松活动,或相反?
因为如果我把HoloTheme用于活动,每一个都View将是Holo ......
我正在尝试自定义DialogFragment的某些样式。
我用以下方式更改了标题的颜色:
TextView title = (TextView)getDialog().findViewById( android.R.id.title );
title.setTextColor( getResources().getColor( R.color.base_app_color ) );
Run Code Online (Sandbox Code Playgroud)
现在,我需要更改标题的背景颜色和底线颜色。
有谁知道哪些是那些android.R.id。或如何存档?

我希望所有人Toolbar看起来都一样,而无需全部设置样式,因此尽管我会为其设置应用程序主题。我希望所有人拥有的东西之一就是colorControlNormal属性。这些是我的尝试:
代码示例1:
<resources>
<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="toolbarStyle">@style/MyTheme.ToolbarStyle</item>
</style>
<style name="MyTheme.ToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
<item name="colorControlNormal">@color/toolbarColorControlNormal</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
代码示例2:
<resources>
<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorControlNormal">@color/toolbarColorControlNormal</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
在代码示例1中,我尝试为Toolbar属性创建自定义样式,并将其设置为主题,但此方法无效。
在代码示例2中,我全局设置了属性并正常工作。但是,它也会影响其他组件,因此无效。
我需要更改all 的tabTextColor和tabSelectedTextColor属性TabLayout,因此我尝试了以下操作:
代码示例3:
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:tabWidgetStyle">@style/TabsStyle</item>
</style>
<style name="TabsStyle" parent="Widget.Design.TabLayout">
<item name="tabTextColor">@color/tabTextColor</item>
<item name="tabSelectedTextColor">@color/tabSelectedTextColor</item>
</style>
</resources>
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我得到它的唯一方法是手动将它们设置为XML:
<android.support.design.widget.TabLayout
[...]
android:background="?android:attr/colorPrimary"
app:tabTextColor="@color/tabTextColor"
app:tabSelectedTextColor="@color/tabSelectedTextColor" />
Run Code Online (Sandbox Code Playgroud)
android ×10
android-theme ×10
android-ktx ×1
font-size ×1
material-components-android ×1
spinner ×1
styles ×1
themes ×1