在Android中为视图设置全局样式

Ema*_*sev 118 android

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

Ste*_*roy 241

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

如果您查看themes.xmlAndroid源代码,您将看到各种小部件的默认样式的一组属性.关键是您在自定义主题中覆盖的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>
Run Code Online (Sandbox Code Playgroud)

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

<application […] android:theme="@style/MyTheme">…
Run Code Online (Sandbox Code Playgroud)

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

这是在API级别4以后的设备上测试的,似乎效果很好.


Cri*_*ian 48

有两种方法可以做到:

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>
Run Code Online (Sandbox Code Playgroud)

例如,您可以按照自己的意愿命名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>
Run Code Online (Sandbox Code Playgroud)

有关进一步参考,您可以阅读本文:了解Android主题和样式

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需将其视为TextViewXML文件中的常规:

<?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>
Run Code Online (Sandbox Code Playgroud)

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


hid*_*dro 5

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

<item name="android:textColorTertiary">@color/your_text_color</item>
Run Code Online (Sandbox Code Playgroud)

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

对于您可以设置属性的列表,请查看Android源代码styles.xmlthemes.xml,或者这个非常有用的要点丹卢,尝试改变每个值,看看它们改变屏幕上的内容。