Android - 自定义View冷知识之读取系统属性(android命名空间)

  • 在自定义View中,大家都知道用下面的方式读取自定义属性

    publicclassMyView{publicMyView(Context ctx, AttributeSet attrs){ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.myview); array.close(); }}

    那么我们要怎么读取 android命名空间下的属性呢?

    很容易想到的是去,既然自定义的样式在 R.styleable这个包下面,那么系统的应该在 android.R.styleable? 很可惜,并没有这样的资源。

    方法一:

    R.styleable.myview其实是一个数组

    <?xml version="1.0" encoding="utf-8"?><resources><declare-styleablename="myview"><attrname="xx"/></declare-styleable></resources>

    所以可以自己声明一个 styleable,把系统的属性组合起来

    privatestaticfinalint[] styleable =newint[] { android.R.attr.layout_width, // index 0 android.R.attr.layout_height, // 1 android.R.attr.layout_margin, // 2 android.R.attr.padding // 3};TypedArray array = context.obtainStyledAttributes(attrs, styleable);intn = array.getIndexCount();for(inti =0; i < n; i++) {intindex = array.getIndex(i);intvalue = array.getDimensionPixelSize(index,0);}array.close();

    经我测试,这个方法 android:padding是读取不到,所以并不推荐。

    方法二:

    在自定义属性中添加属性,命名成 android:xxx,与系统重名,类型不用指定。

    <?xml version="1.0" encoding="utf-8"?><resources><declare-styleablename="myview"><attrname="android:layout_width"/><attrname="android:layout_height"/><attrname="android:layout_margin"/><attrname="android:padding"/></declare-styleable></resources> TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.myview);intwidth = array.getDimensionPixelSize(R.styleable.myview_android_layout_width,0);array.close();

    其实这样就可以读取到对应的值,与声明系统共用一个,但是读取并不冲突,强力推荐。

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页