Android 自定義控件(一)

對於一些項目中通用的視圖,可以採取組合控件的方式定義成一個單獨的控件,簡化開發。常見的如頭部視圖,通用錄音視圖等。今天,記錄一下此種方式。

第一步,設計新控件的獨有屬性。在values文件夾中創建attrs.xml文件,添加屬性。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="HeaderView">
        <attr name="headerTitle" format="string"/>
        <attr name="titleSize" format="dimension"/>
        <attr name="titleColor" format="color"/>
        <attr name="leftImage" format="reference" />
        <attr name="rightText" format="string" />
        <attr name="rightTextSize" format="dimension"/>
        <attr name="rightTextColor" format="color" />
    </declare-styleable>
</resources>

第二部,創建HeaderView控件類,繼承自組合視圖的子類,在HeaderView的構造函數中初始化各個子控件。

public class HeaderView extends RelativeLayout {
    private String title;
    private int titleColor;
    private float titleSize;

    private String rightText;
    private int rightTextColor;
    private float rightTextSize;

    private Bitmap leftBitmap;

    private TextView titleTV;
    private TextView rightTV;
    private ImageView leftIV;


    private LayoutParams titleParams;
    private LayoutParams rightTitleParams;
    private LayoutParams leftTitleParams;

    public HeaderView(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray at = context.obtainStyledAttributes(attrs, R.styleable.HeaderView);

        title = at.getString(R.styleable.HeaderView_headerTitle);
        titleColor = at.getColor(R.styleable.HeaderView_titleColor, 0);
        titleSize = at.getDimension(R.styleable.HeaderView_titleSize, 0);

        rightText = at.getString(R.styleable.HeaderView_rightText);
        rightTextColor = at.getColor(R.styleable.HeaderView_rightTextColor, 0);
        rightTextSize = at.getDimension(R.styleable.HeaderView_rightTextSize, 0);

        leftBitmap = BitmapFactory.decodeResource(getResources(), at.getResourceId(R.styleable.HeaderView_leftImage, 0));

        at.recycle();


        titleTV = new TextView(context);

        titleTV.setText(title);
        titleTV.setTextColor(titleColor);
        titleTV.setTextSize(titleSize);
        titleTV.setGravity(Gravity.CENTER);

        titleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        titleParams.addRule(RelativeLayout.CENTER_IN_PARENT, TRUE);

        addView(titleTV, titleParams);

        rightTitleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        rightTitleParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, TRUE);

        rightTV = new TextView(context);
        rightTV.setText(rightText);
        rightTV.setTextColor(rightTextColor);
        rightTV.setTextSize(rightTextSize);
        rightTV.setGravity(Gravity.CENTER);

        addView(rightTV, rightTitleParams);

        leftIV = new ImageView(context);
        leftIV.setImageBitmap(leftBitmap);

        leftTitleParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        leftTitleParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, TRUE);

        addView(leftIV, leftTitleParams);


    }

    public void setOnRightListener(OnClickListener listener){
        rightTV.setOnClickListener(listener);
    }


}

注意,TypedArray使用之後一定要記着回收,at.recycle();

第三步,在佈局文件中使用,記得配置命名空間。

<!--添加命名空間pretty-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:pretty="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <com.superman.prettygirl.widget.HeaderView
        android:id="@+id/hv_main_header"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        pretty:headerTitle="PrettyGirl"
        pretty:titleSize="6sp"
        pretty:titleColor="#fff"
        pretty:rightText="Cancel"
        pretty:rightTextColor="#fff"
        pretty:rightTextSize="4sp"
        android:background="#ff7428"
        />
</LinearLayout>

第四步,在Activity中獲取此控件,設置點擊事件。

HeaderView headerView = (HeaderView) findViewById(R.id.hv_main_header);
headerView.setOnRightListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_SHORT).show();
    }
});






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章