首页 > 代码库 > Android-Widget源码分析

Android-Widget源码分析



 View以及所有控件是如何得知我们在布局设置的控件ID的.

【Attrs.xml文件】

  # attrs.xml 文件.
  <declare-styleable name="View">
        <!-- reference 代表某一个资源文件!! -->
        <attr name="id" format="reference" />
        ... ...(N多信息哈,自己看代码)
  </declare-styleable>

【View的初始化】

 public static final int NO_ID = -1; 
 ... ...
 @ViewDebug.ExportedProperty(resolveId = true) // (注解) android-19/android/View/ViewDebug.java
 int mID = NO_ID; // 保存控件ID,默认值-1.
 ... ...
    
 public View(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context);
        // 获取attrs.xml属性文件中的View.
        TypedArray a = context.obtainStyledAttributes(
                   attrs, com.android.internal.R.styleable.View, defStyleAttr, 0);
        ... ...
        ... ...(N多代码,省略!!)
        for (int i = 0; i < N; i++) {
            int attr = a.getIndex(i);
            switch (attr) {
                 ... ...(N多代码,省略!!)
                case com.android.internal.R.styleable.View_id: // 控件ID,获取View中的字段id.
                    mID = a.getResourceId(attr, NO_ID);
                    break;

 

【设置控件ID】

    // 设置控件ID.
    public void setId(int id) {
        mID = id;
        if (mID == View.NO_ID && mLabelForId != View.NO_ID) {
            mID = generateViewId();
        }
    }


【获取控件ID】

    // 获取控件ID.
    @ViewDebug.CapturedViewProperty
    public int getId() {
        return mID;
    }

fff


fff