我有自定义视图" address_view.xml"它显示了一个人的姓名和街道地址,定义如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="John Smith"/>
<TextView
android:id="@+id/street_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="2"
tools:text="1 Main St."/>
</LinearLayout>
此视图用于我的应用的多个页面,但每个TextView的字体,文本颜色和大小有两种变体。
是否可以创建&#34;主题&#34;对于这个视图,单独设置名称和地址TextViews的textFont / textColor?例如,我想做类似的事情:
<com.example.view.AddressView
...
style="@style/Theme1" />
设置&#34;名称&#34; TextView使用FontA,ColorA和Size1,并设置&#34;地址&#34; TextView使用FontB,ColorB和Size2。
这样,我可以在某些页面上使用Theme1并创建另一个&#34; Theme2&#34;使用字体/颜色/大小的第二个组合,并在其他页面上使用它。
答案 0 :(得分:1)
首先需要定义自定义属性,然后在样式中使用它们。作为一个例子,我将使用三角形样式。
首先使用您的属性定义要更改的内容并将其放入/res/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Triangle">
<attr name="triangleColor" format="color"/>
<attr name="triangleStrokeColor" format="color"/>
<attr name="triangleStrokeWidth" format="dimension"/>
</declare-styleable>
</resources>
在自定义视图中,您需要阅读
中传递的值 // Get the values from XML
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.Triangle, style, 0);
int tmp;
mTriangleColor = typedArray.getColor(R.styleable.Triangle_triangleColor, mTriangleColor);
mStrokeColor = typedArray.getColor(R.styleable.Triangle_triangleStrokeColor, mStrokeColor);
tmp = typedArray.getDimensionPixelSize(R.styleable.Triangle_triangleStrokeWidth, -1);
mStrokeWidth = tmp != -1 ? tmp : 2 * density; // Use 2dp as a default value
// Don't forget this!
typedArray.recycle();
然后定义样式。 注意:自定义属性项不需要xml命名空间,因此没有 android:
<style name="defaultTriangle">
<item name="triangleColor">#FF33B5E5</item>
<item name="triangleStrokeColor">@android:color/black</item>
<item name="triangleStrokeWidth">3dp</item>
</style>
然后只需申请
<some.package.Triangle
style="@style/defaultTriangle"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:padding="10dp"
android:rotation="0"
/>