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


Answers:


250

实际上,您可以为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>

然后只需将该主题应用于您的应用程序即可AndroidManifest.xml

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

并且您的所有文本视图将默认使用中定义的样式MyTextViewStyle(在这种情况下,为粗体和红色)!

此版本已在API级别4以上的设备上进行了测试,并且效果很好。


1
到目前为止,我看到的最优雅的解决方案。
Italo Borssatto 2011年

@Steve,如果我将项目包含<item name="android:textViewStyle">@style/MyTextViewStyle</item>在MyTheme样式中,然后将该样式应用于我的应用程序,则我TextView的所有s都会根据该样式显示(甚至在操作栏中显示应用程序的名称)。如何使用操作栏解决问题?我希望它具有默认外观。Github
Maksim Dmitriev 2012年

@Steve,如何在应用程序上同时应用(动作栏和小部件)主题
Pratik Butani 2013年

我不确定如何将ActionBar与其他东西区分开。您可能可以找到设置了ActionBar样式的任何位置,然后放到<item name="android:textViewStyle">@style/MyTextViewStyle</item>那里,只需指向ActionBar的默认值(或类似名称)即可
Steve Pomeroy 2013年

@StevePomeroy这对我不起作用..您能提供一些支持吗?TextViews的“我的样式”保持不变。我是否需要设置最少的项目,或者我不允许设置某些项目?
迈克

52

有两种方法可以这样做:

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>

有关更多参考,请阅读本文:了解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);
    }
}

然后,您只需要TextView在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"
    >
<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行)。仅当您修改行为时才应使用自定义类,如果唯一的变化是视图的外观,则不要使用自定义类。
安德烈(Andre)

无法从xml设置自定义视图的样式吗?为什么我们不能在custom_view_layout.xml用于膨胀自定义类的文件中使用它?
lucidbrot

5

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

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

可以使用框架属性或支持库属性(如果您使用支持库)来控制许多其他Android控件的颜色。

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


谢谢你,兄弟!我花了很多时间弄清楚为什么textColorPrimary不起作用。
pratt

3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.