我有一个自定义的android视图类,其中包括将大量文本直接绘制到提供给它的onDraw覆盖的画布上。
我想要做的是有一个属性,可以设置为“?android:attr / textAppearanceLarge”,并选择常规文本设置而无需进一步设置样式。
在我的自定义视图的attrs.xml中,我有
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView" >
...
<attr name="textAppearance" format="reference" />
...
</declare-styleable>
</resources>
然后在CustomView.java
中final int[] bogus = new int[] { android.R.attr.textColor, android.R.attr.textSize, android.R.attr.typeface, android.R.attr.textStyle, android.R.attr.fontFamily };
final int ap = styledAttributes.getResourceId(com.test.R.styleable.MyView_textAppearance, -1);
final TypedArray textAppearance = ap != -1 ? context.obtainStyledAttributes(ap, bogus) : null;
if (textAppearance != null) {
for (int i = 0; i < textAppearance.getIndexCount(); i++) {
int attr = textAppearance.getIndex(i);
switch (attr) {
case android.R.attr.textColor: textColor = textAppearance.getColor(attr, textColor); break;
case android.R.attr.textSize: textSize = textAppearance.getDimensionPixelSize(attr, textSize); break;
case android.R.attr.typeface: typefaceIndex = textAppearance.getInt(attr, typefaceIndex); break;
case android.R.attr.textStyle: textStyle = textAppearance.getInt(attr, textStyle); break;
case android.R.attr.fontFamily: fontFamily = textAppearance.getString(attr); break;
}
}
textAppearance.recycle();
}
我已经在switch变量上尝试了各种变体,对于case常量等,我从来没有得到过 甚至任何东西都有用。
我在这里做错了什么?
答案 0 :(得分:0)
我认为您可以访问不同的资源:
com.test.R.styleable.MyView_textAppearance
是你自己的,
android.R.attr.textColor
和其他人是Android的。
所以我设法定义了我自己的属性:
<com.test.TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
myns:textColor="@android:color/darker_gray"
myns:textSize="18sp"
myns:textStyle="normal"/>
和attrs.xml:
<declare-styleable name="MyView_textAppearance">
<attr name="textColor" format="reference|color" />
<attr name="textSize" format="dimension" />
<attr name="textStyle">
<flag name="normal" value="0" />
<flag name="bold" value="1" />
<flag name="italic" value="2" />
</attr>
</declare-styleable>
答案 1 :(得分:0)
我知道这是一个老问题,但是偶然发现了这个问题,该解决方案对我有用:
在attrs.xml中
<resources>
<declare-styleable name="CustomView">
....
<attr name="textAppearance" format="reference" />
</declare-styleable>
</resources>
在CustomView.java
textAppearance = a.getResourceId(R.styleable.CustomView_textAppearance, -1);
TextViewCompat.setTextAppearance(textView, textAppearance);
然后在activity.xml中
<CustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:textAppearance="?android:attr/textAppearanceMedium"