标签: android-theme

Android setTheme() 不改变 ActionBar 和 Status Bar

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

2
推荐指数
1
解决办法
3499
查看次数

如何根据应用程序的整体主题更改“app:popupTheme”?

在具有可配置主题的应用程序中,如何设置app:popupTheme才能匹配整体主题?

\n\n

我使用 Android Studio 的向导创建了一个带有导航抽屉的应用程序。然后,我修改了此代码以添加一个复选框,用于在运行时在深色主题和浅色主题之间进行选择并调用setTheme活动。完整的代码可以在此 github 存储库中找到。

\n\n

在 中app/src/main/res/values/styles.xml,Android Studio 生成了以下内容:

\n\n
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

中使用的这种样式app/src/main/res/layout/app_bar_main.xml,也是由Android Studio生成的:

\n\n
<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"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

app:popupTheme属性决定“\xe2\x8b\xae”菜单使用的样式。使用浅色主题时这看起来是正确的,但是当我在运行时将应用程序切换到深色主题时,菜单的颜色错误。我知道我可以改变AppTheme.PopupOverlay\ 的父母,如下所示:

\n\n
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

使其在深色主题中工作,但当浅色主题处于活动状态时,菜单看起来错误。

\n\n

让菜单的颜色动态适应应用程序的整体主题(无论是深色还是浅色)的正确方法是什么?应该app:popupTheme动态改变吗?AppTheme.PopupOverlay\ 的父级应该动态更改吗?还有别的事吗?

\n

android android-theme android-styles

2
推荐指数
1
解决办法
2609
查看次数

SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 不适用于 API 28

我有一个问题,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)

android android-theme android-styles android-navigation-bar

2
推荐指数
1
解决办法
3996
查看次数

Android studio 布局预览没有获取我当前的主题

我有一个测试多模块项目,有些模块看不到我的应用程序主题。更详细地说,模块如下:应用程序、公共、主页和详细信息。

应用程序模块包含一个活动和导航,公共部分包含字符串,样式和主页/详细信息包含一个虚拟片段。所有片段都实现了包含我的风格的公共模块。

// Modules
implementation project(path: ':navigation')
implementation project(path: ':common')
Run Code Online (Sandbox Code Playgroud)

因此,当我转到活动的布局编辑器并尝试从预览中更改主题时,我可以看到并选择我的主题。 活动主文件

但我去 HomeFragment 的布局不存在这样的选项。 片段_home.xml

当然,当我运行应用程序时,样式可以按预期工作,唯一的问题是预览不起作用。这是公共模块上的主题:

<?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 …

android android-theme android-studio

2
推荐指数
1
解决办法
1900
查看次数

为什么我的默认警报对话框按钮文本是白色的?

我已按如下方式设置我的应用程序:

构建.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

2
推荐指数
1
解决办法
542
查看次数

修改现有主题

我想知道是否可以(以及如何)自定义现有主题.

我正在寻找的是如何检索某个属性(即颜色)并在Activity启动时更改它并重新应用之前修改过的主题setContentView().

与之类似setTheme(),但不使用资源ID,而是使用修改后的主题.

android themes styles android-theme

1
推荐指数
1
解决办法
2262
查看次数

Android:在Widget.Holo.TabWidget中更改TabHost中的字体大小

我按照这里的答案: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的原始定义, …

android font-size android-tabhost android-theme

1
推荐指数
1
解决办法
7290
查看次数

从特定主题中选择一个微调器

我怎样才能获得Holo Spinner轻松活动,或相反?

因为如果我把HoloTheme用于活动,每一个都View将是Holo ......

android spinner android-theme

1
推荐指数
1
解决办法
8230
查看次数

如何更改DialogFragment标题背景颜色和底线颜色

我正在尝试自定义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。或如何存档?

在此处输入图片说明

android android-theme android-alertdialog

1
推荐指数
1
解决办法
6845
查看次数

XML样式放在哪里

问题1

我希望所有人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中,我全局设置了属性并正常工作。但是,它也会影响其他组件,因此无效。

  • 为什么代码示例1无法正常工作?

问题2

我需要更改all 的tabTextColortabSelectedTextColor属性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)
  • 为什么代码示例3无法正常工作? …

android android-theme android-styles android-toolbar

1
推荐指数
1
解决办法
321
查看次数