在Android中为视图设置全局样式
比方说,我希望我的应用程序中的所有TextView
实例具有textColor="#ffffff"
。 有没有办法在一个地方设置,而不是为每个TextView
设置?
实际上,您可以为TextView(以及大多数其他内置小部件)设置默认样式,而无需执行自定义Java类或单独设置样式。
如果你看一下Android源文件中的themes.xml
,你会看到一些属性为各种小部件的默认样式。 关键是您在自定义主题中覆盖的editTextStyle
(或editTextStyle
等)属性。 您可以通过以下方式覆盖它们:
创build一个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
中定义的MyTextViewStyle
(在这种情况下,粗体和红色)!
这是从API级别4以上的设备进行testing,似乎很好。
有两种方法可以这样做:
1.使用样式
您可以通过在res/values
目录中创buildXML文件来定义自己的样式。 所以,假设您想要红色和粗体的文本,然后创build一个包含以下内容的文件:
<?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); } }
然后,你只需要把它作为你的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>
无论您使用一个还是另一个select取决于您的需求。 如果你想要做的唯一的事情是修改外观,那么最好的方法是第一个。 另一方面,如果你想改变外观,并为你的小部件添加一些新的function,第二个是要走的路。
定义一个样式并在每个小部件上使用它,定义一个覆盖该小部件的android默认值的主题,或者定义一个string资源并在每个小部件中引用它
对于TextView
默认文本颜色,将主题中的android:textColorTertiary
设置为所需的颜色:
<item name="android:textColorTertiary">@color/your_text_color</item>
许多其他Android控件的颜色可以使用框架属性来控制,或者如果您使用支持库,则支持库属性。
有关可以设置的属性列表,请查看styles.xml
和themes.xml
Android源代码 ,或Dan Lew提供的非常有用的要点 ,尝试更改每个值并查看它们在屏幕上的变化。