在AttributeSet中访问自定义组件的attrs
我有一个自定义组件,其中包含两个具有自定义尺寸设置方法的TextView(两个文本视图的比例大约为1:2)。由于这是RelativeLayout的子类,因此它没有textSize属性,但是我想知道是否仍然可以android:textSize
在XML实例中为此组件设置属性,然后textSize
从AttributeSet中获取要使用的属性与我setSize()
在构造函数中的自定义方法。
我已经看到了使用自定义属性执行此操作的技术,但是如果我想获取Android词典中已经存在的属性该怎么办?
回答:
是的,有可能;
假设您的RelativeLayout声明(以xml格式)具有使用14sp定义的textSize:
android:textSize="14sp"
在自定义视图的构造函数(采用AttributeSet的视图)中,您可以从Android的命名空间中检索属性,如下所示:
String xmlProvidedSize = attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "textSize");
xmlProvidedSize的值将类似于“ 14.0sp”,并且可能只需进行少量的字符串编辑就可以提取数字。
声明您自己的属性集的另一种选择可能不会很冗长,但是也可以。
因此,您拥有了自定义视图,并且TextViews声明了类似这样的权限:
public class MyCustomView extends RelativeLayout{ private TextView myTextView1;
private TextView myTextView2;
// rest of your class here
大…
现在,您还需要确保自定义视图会覆盖采用AttributeSet的构造函数,如下所示:
public MyCustomView(Context context, AttributeSet attrs){ super(context, attrs);
init(attrs, context); //nice, clean method to instantiate your TextViews//
}
好的,让我们现在看看init()方法:
private void init(AttributeSet attrs, Context context){ // do your other View related stuff here //
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MyCustomView);
int xmlProvidedText1Size = a.int(R.styleable.MyCustomView_text1Size);
int xmlProvidedText2Size = a.int(R.styleable.MyCustomView_text2Size);
myTextView1.setTextSize(xmlProvidedText1Size);
myTextView2.setTextSize(xmlProvidedText2Size);
// and other stuff here //
}
您可能想知道R.styleable.MyCustomView,R.styleable.MyCustomView_text1Size和R.styleable.MyCustomView_text2Size来自何处;请允许我详细说明。
您必须在attrs.xml文件(在values目录下)中声明属性名称,以便在使用自定义视图的任何地方,从这些属性收集的值都将交到构造函数中。
因此,让我们看看如何像您所要求的那样声明这些自定义属性:这是我的整个attrs.xml
<?xml version="1.0" encoding="utf-8"?><resources>
<declare-styleable name="MyCustomView">
<attr name="text1Size" format="integer"/>
<attr name="text2Size" format="integer"/>
</declare-styleable>
</resources>
现在,您可以在XML中设置TextViews的大小,但是在不声明Layout中的命名空间的情况下,可以这样设置:
<com.my.app.package.MyCustomView xmlns:josh="http://schemas.android.com/apk/res-auto"
android:id="@+id/my_custom_view_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
josh:text1Size="15"
josh:text2Size="30"
/>
请注意,我如何将名称空间声明为“ josh”作为CustomView属性集中的第一行。
我希望这对Josh有帮助,
以上是 在AttributeSet中访问自定义组件的attrs 的全部内容, 来源链接: utcz.com/qa/432506.html