首页 > 代码库 > 自定义控件的使用步骤

自定义控件的使用步骤

最近在跟着老师学习开发简易版微博APP,于是想着把所学的重要知识点记录下来。

自定义控件的开发步骤,主要分为4步:

1.编写attr.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="LineItem">
        <attr name="rightimage" format="reference"/>
        <attr name="midcontent" format="string"/>
        <attr name="lineShown" format="boolean" />
    </declare-styleable>
</resources>

2.编写布局文件,对自定义属性进行封装

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:orientation="vertical"
    >
    <ImageView
        android:id="@+id/iv_seperator"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/iv_seperator"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/tv_customcontent"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_weight="10"
            android:textSize="@dimen/text_size_14"
            />
        <ImageView
            android:id="@+id/ic_right"
            android:layout_marginRight="5dp"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:src="@drawable/ic_right"
            />
    </LinearLayout>

3.编写自定义控件,在代码获取自定义控件的属性

public class LineItem extends RelativeLayout {
    private Context mContext;
    private LayoutInflater mInflater;
    private RelativeLayout layout;
    private ImageView mRightIV;
    private ImageView mLineImageView;
    private TextView mMidContent;
    private Boolean lineShown;

    public LineItem(Context context) {
        this(context, null);
    }

    public LineItem(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public LineItem(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.mContext = context;
        this.mInflater = LayoutInflater.from(mContext);
        this.layout = (RelativeLayout) this.mInflater.inflate(R.layout.item_line, this, true);
        mRightIV = (ImageView) this.layout.findViewById(R.id.ic_right);
        mLineImageView = (ImageView) this.layout.findViewById(R.id.iv_seperator);
        mMidContent = (TextView) this.layout.findViewById(R.id.tv_customcontent);
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.LineItem);
        this.mMidContent.setText(array.getString(R.styleable.LineItem_midcontent));
        this.lineShown = array.getBoolean(R.styleable.LineItem_lineShown, true);
        this.mRightIV.setImageResource(array.getResourceId(R.styleable.LineItem_rightimage, R.drawable.ic_right));
        if (!lineShown) {
            mLineImageView.setVisibility(View.GONE);
        }
        array.recycle();
    }

}

4.使用自定义属性,在XML中赋值(也可以通过代码赋值)

<com.sina.weibo.sdk.demo.LineItem
                android:id="@+id/item_my_topic"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                lin:rightimage="@drawable/ic_right"
                lin:midcontent="我的微博"
                lin:lineshow="false"
                />
            <com.sina.weibo.sdk.demo.LineItem
                android:id="@+id/item_my_home"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                lin:rightimage="@drawable/ic_right"
                lin:midcontent="我的主页"
                lin:lineshow="false"
                />

            <com.sina.weibo.sdk.demo.LineItem
                android:id="@+id/item_my_collect"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                lin:rightimage="@drawable/ic_right"
                lin:midcontent="我的收藏"
                lin:lineshow="true"
                />

 

自定义控件的使用步骤