【问题标题】:Setting global styles for Views in Android在 Android 中为视图设置全局样式
【发布时间】:2010-06-20 03:07:55
【问题描述】:

假设我希望我的应用程序中的所有TextView 实例都具有textColor="#ffffff"。有没有办法在一个地方设置它而不是为每个TextView 设置它?

【问题讨论】:

标签: android


【解决方案1】:

实际上,您可以为 TextViews(以及大多数其他内置小部件)设置默认样式,而无需执行自定义 java 类或单独设置样式。

如果您查看 Android 源代码中的 themes.xml,您将看到各种小部件的默认样式的一堆属性。关键是您在自定义主题中覆盖的textViewStyle(或editTextStyle 等)属性。您可以通过以下方式覆盖它们:

创建styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="android:Theme">
    <item name="android:textViewStyle">@style/MyTextViewStyle</item>
</style>

<style name="MyTextViewStyle" parent="android:Widget.TextView">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
</style>
</resources>

然后在AndroidManifest.xml 中将该主题应用到您的应用程序:

<application […] android:theme="@style/MyTheme">…

您的所有文本视图都将默认为MyTextViewStyle 中定义的样式(在本例中为粗体和红色)!

这已在 API 级别 4 及以上的设备上进行了测试,似乎效果很好。

【讨论】:

  • 迄今为止我看到的最优雅的解决方案。
  • @Steve,如果我将项目 &lt;item name="android:textViewStyle"&gt;@style/MyTextViewStyle&lt;/item&gt; 包含在样式 MyTheme 中,然后将该样式应用于我的应用程序,我所有的 TextViews 都将根据样式显示(甚至是应用程序在操作栏中)。如何解决操作栏的问题?我希望它具有默认外观。 Github
  • @Steve,如何在应用程序上同时应用(操作栏和小部件)主题
  • 我不确定如何将 ActionBar 与其他事物区分开来。您可以找到设置 ActionBar 样式的位置,然后将 &lt;item name="android:textViewStyle"&gt;@style/MyTextViewStyle&lt;/item&gt; 也放在那里,只需指向 ActionBar 默认值(或类似的东西)
  • @StevePomeroy 这对我不起作用.. 你能提供一些支持吗?我的 TextViews 样式保持不变。是否有我需要设置的最少项目或有一些我不允许设置的项目?
【解决方案2】:

有两种方法:

1。使用样式

您可以通过在res/values 目录中创建 XML 文件来定义自己的样式。因此,假设您想要红色和粗体文本,然后创建一个包含以下内容的文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyRedTheme" parent="android:Theme.Light">
    <item name="android:textAppearance">@style/MyRedTextAppearance</item>
  </style>
  <style name="MyRedTextAppearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
  </style>
</resources>

您可以随意命名,例如res/values/red.xml。然后,您唯一需要做的就是在所需的小部件中使用该视图,例如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    style="@style/MyRedTheme"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

更多参考,可以阅读这篇文章:Understanding Android Themes and Styles

2。使用自定义类

这是实现此目的的另一种可能方法,它是提供您自己的TextView,将文本颜色始终设置为您想要的任何颜色;例如:

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.TextView;
public class RedTextView extends TextView{
    public RedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTextColor(Color.RED);
    }
}

然后,您只需在 XML 文件中将其视为普通的TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<org.example.RedTextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

您是否使用一种或另一种选择取决于您的需求。如果您只想修改外观,那么最好的方法是第一种。另一方面,如果你想改变外观并为你的小部件添加一些新功能,那么第二个就是你要走的路。

【讨论】:

  • 应该首选使用自定义类,因为这是更简洁的方法,有助于保持 xml 文件的轻量级。
  • @AmitKumar 不,他们不应该!在这种特殊情况下,这意味着为每个不同的属性值使用单独的自定义类。这会产生大量臃肿的代码并使实际的布局不再可读(您必须访问每个类以查看它在做什么,而不是仅仅阅读几行 xml 行)。仅当您修改行为时才应使用自定义类,但如果唯一的变化是视图的外观,则不应使用。
  • 不能从xml设置自定义视图的样式吗?为什么我们不能在用于扩充自定义类的custom_view_layout.xml 文件中使用它?
【解决方案3】:

对于TextView 中的默认文本颜色,请将主题中的android:textColorTertiary 设置为所需颜色:

<item name="android:textColorTertiary">@color/your_text_color</item>

许多其他 Android 控件的颜色可以使用框架属性进行控制,如果您使用支持库,则可以使用支持库属性。

有关您可以设置的属性列表,请查看styles.xmlthemes.xml 中的Android source code,或者Dan Lew 提供的非常有用的gist,尝试更改每个值并查看它们在屏幕上的变化。

【讨论】:

  • 谢谢你,伙计!我花了很多时间弄清楚为什么 textColorPrimary 不起作用。
【解决方案4】:

定义一个样式并在每个小部件上使用它,定义一个覆盖该小部件的android默认值的主题,或者定义一个字符串资源并在每个小部件中引用它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2015-04-17
    • 2011-12-09
    相关资源
    最近更新 更多