gpt4 book ai didi

android - 在 Android 中,可以在运行时在单个 XML 布局的 TextView 中应用不同的主题而不创建自定义小部件吗?

转载 作者:搜寻专家 更新时间:2023-11-01 08:51:28 25 4
gpt4 key购买 nike

我以前在这里看到过类似的问题,但都没有一个令人满意的答案。基本上,我想要一个布局而不是多个布局,并且能够在运行时应用主题。例如,让我们采用这种布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android" >

<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="SAMPLE HEADING"
style="@style/Heading" />
</LinearLayout>

并且主题和样式设置如下:

<style name="AppTheme.Dark" parent="AppTheme">
<item name="android:radioButtonStyle">@style/radioButton.Dark</item>
<item name="android:checkboxStyle">@style/checkbox.Dark</item>
</style>

<style name="AppTheme.Light" parent="AppTheme">
<item name="android:radioButtonStyle">@style/radioButton.Ios</item>
<item name="android:checkboxStyle">@style/checkbox.Ios</item>
</style>

<style name="Heading">
<item name="android:typeface">sans</item>
<item name="android:textStyle">bold</item>
</style>

<style name="Heading.Dark" parent="Heading">
<item name="android:textColor">@color/red</item>
<item name="android:background">@drawable/dark_bg</item>
<item name="android:textSize">16dip</item>
</style>

<style name="Heading.Light" parent="Heading">
<item name="android:textColor">@color/black</item>
<item name="android:background">@drawable/light_bg</item>
<item name="android:textSize">17dip</item>
</style>

因此,我希望能够通过简单地应用深色或浅色 AppTheme 将深色和浅色 Heading 样式应用于该 TextView。而且我不想将这些样式应用于所有 TextView,而只是特定的。我也不想以编程方式执行此操作,因为有太多 TextView 需要完成此操作。

有没有办法做到这一点,还是我必须创建两个相同的 XML 布局,其中一个使用 Heading.Light 样式,另一个使用 Heading.Dark?

最佳答案

首先,您对 parent="..." 属性的使用不正确。

作为official docs状态:

“如果您想继承自己定义的样式,则不必使用 parent 属性。相反,只需在您想要的样式名称前加前缀继承您的新样式的名称,以句点分隔。”

因此,将您的样式名称声明为 Heading.Light 就足以指定它的父样式是 Heading

现在回答你的问题。创建一个 res/values/attrs.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="myTextViewColor" format="reference|color" />
</resources>

然后在您的 styles.xml 中声明您的主题如下:

<style name="AppTheme">
<!--parent style. could be overriden by Dark and Light theme -->
</style>

<style name="AppTheme.Dark">
...
<item name="myTextViewColor">@color/red</item>
</style>

<style name="AppTheme.Light">
...
<item name="myTextViewColor">@color/black</item>
</style>

<style name="Heading">
<item name="android:typeface">sans</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">16dip</item>
</style>

现在申请的时候

<TextView ... style="@style/Heading" android:textColor="?myTextViewColor />

一切正常。只需确保在您的应用中应用AppTheme.LightAppTheme.Dark 主题(因为AppTheme 父主题会不知道自定义属性的值)。

编辑:另外,作为user496854建议,还有另一种简单的解决方法。

声明 headingStyle 属性作为引用:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="headingStyle" format="reference" />
</resources>

然后在我们的 AppTheme.DarkAppTheme.Light 样式中,我们将指向相应的标题样式:

<style name="AppTheme.Dark">
...
<item name="headingStyle">@style/Heading.Dark</item>
</style>

<style name="AppTheme.Light">
...
<item name="headingStyle">@style/Heading.Light</item>
</style>

关于android - 在 Android 中,可以在运行时在单个 XML 布局的 TextView 中应用不同的主题而不创建自定义小部件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22980183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com