在AttributeSet中访问自定义组件的attrs

在AttributeSet中访问自定义组件的attrs,第1张

在AttributeSet中访问自定义组件的attrs

是的,有可能;

假设您的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有帮助,



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4938007.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存