接受自定义视图的文本样式

3

我正在编写自己的自定义视图,其中包含TextView和EditText。我想让用户分别为每个控件设置文本样式,如下所示:

<declare-styleable name="InputRow">
    <attr name="descriptionTextStyle" format="string" />
    <attr name="valueTextStyle" format="string" />
</declare-styleable>

我原本以为这样可以行得通,在XML中我可以这样说:

app:descriptionTextStyle="bold"
app:valueTextStyle="italic"

然而,当我尝试从类型数组中读取时,问题就出现了。我可以获取字符串:
if(typedArray.hasValue(R.styleable.InputRow_descriptionTextStyle)) {
   setDescriptionTextStyle(typedArray.getString(R.styleable.InputRow_descriptionTextStyle));
}

但是当我想调用 descriptionTextView.setTypeface(Typeface tf, int style) 时,我需要第二个参数的整数值,而我没有。

我不能将样式更改为int格式,因为那么="bold" 将无效,所以我不知道如何获取文本样式。


请查看文件 <SDK>/platforms/android-XX/data/res/values/attrs.xml 并找到 textStyle - pskink
@pskink 哦,好的,我觉得我在这方面有点眉目了,谢谢。 - AdamMc331
虽然您可以在<declare-styleable>中添加<attr name="android:textStyle" />,但无法使用不同名称/别名的两个不同的 android:textStyle - pskink
是的,我知道第一个选项,但这意味着我只能使用一种文本样式,并且仅将其应用于两个视图中的一个(或两个)。你是在暗示我不能为它们提供不同的样式吗? - AdamMc331
在我看来,你需要重复定义 android:textStyle,就像这样 - pskink
我知道这很奇怪和冗余,因为应该有一种方法来指定自定义属性的名称和格式(数据类型):基本类型或用户定义的类型,但据我所知,你不能这样做。 - pskink
2个回答

3

感谢pskink的建议,我查看了Android如何定义样式:

<!-- Default text typeface style. -->
<attr name="textStyle">
    <flag name="normal" value="0" />
    <flag name="bold" value="1" />
    <flag name="italic" value="2" />
</attr>

鉴于此,我能够相应地更新我的自定义属性:

<attr name="descriptionTextStyle">
    <flag name="normal" value="0" />
    <flag name="bold" value="1" />
    <flag name="italic" value="2" />
</attr>

然后,我通过调用 app:descriptionTextStyle="bold" 来设置我的项目,在类中调用 typedArray.getInt() 并调用 setTypeface() 方法。感谢您的帮助!


请记住,如果您只想使用一个这样的属性,则可以使用现有的 <attr name="android:textStyle" /> - pskink
没错,但我不这样做是因为我想能够将不同的属性应用于TextView和EditText @pskink - AdamMc331

1
你可以使用

标签。

 public void setTypeface(Typeface tf);

这个方法只需要一个字体参数。

将字符串转换为字体,您可以像这样操作:

switch (typefaceString) {
case SANS:
tf = Typeface.SANS_SERIF;
break;

case SERIF:
tf = Typeface.SERIF;
break;

case MONOSPACE:
tf = Typeface.MONOSPACE;
break;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接