美文网首页
深入理解Android中的自定义属性

深入理解Android中的自定义属性

作者: aafa41d78d15 | 来源:发表于2017-08-28 10:49 被阅读0次

    这种文章很多人都不太愿意看,原因是对于项目上是没有直接的意义的。而我认为,这种文章不仅有利于我们更加深刻的理解某个知识点,而且还能帮助我们学习编程思想和设计原理。

    1.TypedArray到底有什么作用?

    首先看代码

    <com.example.test.MyTextView
            android:layout_width="@dimen/dp100"
            android:layout_height="@dimen/dp200"
            zhy:testAttr="520"
            zhy:text="@string/hello_world" />
    
    public MyTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            int count = attrs.getAttributeCount();
            for (int i = 0; i < count; i++) {
                String attrName = attrs.getAttributeName(i);
                String attrVal = attrs.getAttributeValue(i);
                Log.e(TAG, "attrName = " + attrName + " , attrVal = " + attrVal);
            }
    
            // ==>use typedarray ...
    
        }
    

    输出如下:

    MyTextView(4692): attrName = layout_width , attrVal = @2131165234
    MyTextView(4692): attrName = layout_height , attrVal = @2131165235
    MyTextView(4692): attrName = text , attrVal = @2131361809
    MyTextView(4692): attrName = testAttr , attrVal = 520
    />/>use typedarray
    MyTextView(4692): text = Hello world! , textAttr = 520

    通过AttributeSet获取的值,如果是引用都变成了@+数字的字符串。 TypedArray其实是用来简化我们的工作的。

    2.属性文件中生命的declare-styleable的作用是什么?

    以下是不用styleable的情况~

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <attr name="testAttr" format="integer" />
    </resources>
    
    package com.example.test;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.View;
    
    public class MyTextView extends View {
    
        private static final String TAG = MyTextView.class.getSimpleName();
    
        private static final int[] mAttr = { android.R.attr.text, R.attr.testAttr };
        private static final int ATTR_ANDROID_TEXT = 0;
        private static final int ATTR_TESTATTR = 1;
    
        public MyTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            // ==>use typedarray
            TypedArray ta = context.obtainStyledAttributes(attrs, mAttr);
    
            String text = ta.getString(ATTR_ANDROID_TEXT);
            int textAttr = ta.getInteger(ATTR_TESTATTR, -1);
            //输出 text = Hello world! , textAttr = 520
            Log.e(TAG, "text = " + text + " , textAttr = " + textAttr);
    
            ta.recycle();
        }
    
    }
    

    styleale的出现系统可以为我们完成很多常量(int[]数组,下标常量)等的编写,简化我们的开发工作(想想如果一堆属性,自己编写常量,你得写成什么样的代码)。

    参考文章:

    http://blog.csdn.net/lmj623565791/article/details/45022631

    相关文章

      网友评论

          本文标题:深入理解Android中的自定义属性

          本文链接:https://www.haomeiwen.com/subject/abmwdxtx.html