假设我希望我的应用中的所有TextView
个实例都有textColor="#ffffff"
。有没有办法在一个地方设置它而不是为每个TextView
设置它?
答案 0 :(得分:223)
实际上,您可以为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以后的设备上进行测试,似乎效果很好。
答案 1 :(得分:43)
有两种方法:
您可以通过在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
这是实现此目的的另一种可能方式,它将提供您自己的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>
您是否使用一种或另一种选择取决于您的需求。如果您唯一想做的就是修改外观,那么最好的方法就是第一个。另一方面,如果你想改变外观并为你的小部件添加一些新功能,那么第二个就是要走的路。
答案 2 :(得分:4)
对于TextView
中的默认文字颜色,请将主题中的android:textColorTertiary
设置为所需的颜色:
<item name="android:textColorTertiary">@color/your_text_color</item>
如果使用支持库,可以使用框架属性控制许多其他Android控件的颜色,或支持库属性。
有关您可以设置的属性列表,请查看styles.xml
和themes.xml
的{{3}}或Dan Lew的这个非常有用的Android source code,尝试更改每个值和看看他们在屏幕上的变化。
答案 3 :(得分:3)
定义一个样式并在每个小部件上使用它,定义一个覆盖该小部件的android默认值的主题,或者定义一个字符串资源并在每个小部件中引用它