创建"主题"用于包含多个内部文本视图的自定义Android视图

时间:2015-05-05 19:47:43

标签: android android-view android-styles

我有自定义视图" 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;使用字体/颜色/大小的第二个组合,并在其他页面上使用它。

1 个答案:

答案 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"
    />