Android UI開發詳解之模板控件的復用

jopen 11年前發布 | 33K 次閱讀 Android開發 移動開發 Android UI

Android的UI設計一直是Android程序員比較苦惱的一件事,本文主要講解如何將一些模板類控件進行復用,從而簡化UI的開發。

如圖:

Android UI開發詳解之模板控件的復用

我們很多程序的界面中,頂部的TopBar是不變的,所以,我們可以做一個公用的控件模板,每次使用時,只要設置相應的參數,就能生成這樣一個TopBar。

模板控件實現方法:

package com.xys.multiplexedmodule;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MultipleTopBar extends RelativeLayout{

    private Button btn_left;
    private Button btn_right;
    private TextView tv_title;

    private TopBarClickListener topBarClickListener;
    private String str_title;

    private RelativeLayout.LayoutParams leftButtonLayoutParams;
    private RelativeLayout.LayoutParams rightButtonLayoutParams;
    private RelativeLayout.LayoutParams tvTitleLayoutParams;

    private static int leftBtnId=1;
    private static int titleTvId=2;
    private static int rightBtnId=3;

    private Drawable leftBtnBackground;
    private Drawable rightBtnBackground;

    private String str_LeftBtn;
    private String str_RightBtn;
    private int leftBtnColor;
    private int rightBtnColor;
    private int titleTvColor;

    private float titleTextSize;

    public MultipleTopBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        //從參數列表中獲取參數
        //TypedArray實例是個屬性的容器,context.obtainStyledAttributes()方法返回得到。AttributeSet是節點的屬性集合
        //第二個參數為 為獲取到值時的默認值
        TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.TopBar);
        this.str_title=ta.getString(R.styleable.TopBar_title);
        this.leftBtnBackground=ta.getDrawable(R.styleable.TopBar_leftBackground);
        this.rightBtnBackground=ta.getDrawable(R.styleable.TopBar_rightBackground);
        this.str_LeftBtn=ta.getString(R.styleable.TopBar_leftText);
        this.str_RightBtn=ta.getString(R.styleable.TopBar_rightText);
        this.leftBtnColor=ta.getColor(R.styleable.TopBar_leftTextColor, 0);
        this.rightBtnColor=ta.getColor(R.styleable.TopBar_rightTextColor, 0);
        this.titleTextSize=ta.getDimension(R.styleable.TopBar_titleTextSize, 14);
        this.titleTvColor=ta.getColor(R.styleable.TopBar_titleTextColor, 0);

        ta.recycle();

        btn_left=new Button(context);
        btn_right=new Button(context);
        tv_title=new TextView(context);

        btn_left.setId(leftBtnId);
        btn_right.setId(rightBtnId);
        tv_title.setId(titleTvId);

        //為組件配置布局參數
        leftButtonLayoutParams=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        rightButtonLayoutParams=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        tvTitleLayoutParams=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);

        leftButtonLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,RelativeLayout.TRUE);
        leftButtonLayoutParams.setMargins(12, 0, 0, 0);//左上右下
        leftButtonLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);

        rightButtonLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
        rightButtonLayoutParams.setMargins(0, 0, 12, 0);//左上右下
        rightButtonLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);

        tvTitleLayoutParams.setMargins(12, 0, 12, 0);//左上右下
        tvTitleLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
        tvTitleLayoutParams.addRule(RelativeLayout.LEFT_OF, rightBtnId);
        tvTitleLayoutParams.addRule(RelativeLayout.RIGHT_OF, leftBtnId);
        //tvTitleLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
        tv_title.setGravity(Gravity.CENTER);
        tv_title.setBackgroundColor(leftBtnColor);

        addView(btn_left, leftButtonLayoutParams);
        addView(btn_right,rightButtonLayoutParams);
        addView(tv_title,tvTitleLayoutParams);

        //btn_left.setBackgroundDrawable(leftBtnBackground);
        btn_left.setText(str_LeftBtn);
        btn_left.setTextColor(leftBtnColor);
        //btn_right.setBackgroundDrawable(rightBtnBackground);
        btn_right.setText(str_RightBtn);
        btn_right.setTextColor(rightBtnColor);

        tv_title.setTextSize(22.0f);
        tv_title.setTextColor(Color.BLUE);
        tv_title.setEllipsize(TruncateAt.MIDDLE);
        tv_title.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
        tv_title.setSingleLine(true);
        tv_title.setText(str_title);
        tv_title.setTextSize(titleTextSize);
        tv_title.setTextColor(titleTvColor);

        btn_left.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    if(topBarClickListener!=null){
                        topBarClickListener.leftBtnClick();
                }
                }
        });

        btn_right.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                        if(topBarClickListener!=null){
                                topBarClickListener.rightBtnClick();
                        }
                }
        });

    }

    /*
     * 單擊監聽事件
     */
    public void setTopBarClickListener(TopBarClickListener topBarClickListener){
        this.topBarClickListener=topBarClickListener;
    }
}

 

監聽接口:

package com.xys.multiplexedmodule;

public interface TopBarClickListener {

    void leftBtnClick();
    void rightBtnClick();
}

對我們自定義的模板控件,我們需要設定他的一些參數,在Values下新建attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--declare-styleable:自定義屬性的值  -->
    <declare-styleable name="TopBar">
        <attr name="title" format="string" />
        <attr name="titleTextSize" format="dimension" />
        <attr name="titleTextColor" format="color" />
        <attr name="leftTextColor" format="color" />
        <attr name="leftBackground" format="string" />
        <attr name="leftText" format="string" />
        <attr name="rightTextColor" format="color" />
        <attr name="rightBackground" format="string" />
        <attr name="rightText" format="string" />
    </declare-styleable>

</resources>

現在我們就已經做好了一個模板,我們要如何使用他呢,很簡單:

測試類:

package com.xys.multiplexedmodule;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;

public class TestActivity extends Activity {

    private MultipleTopBar topBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        topBar=(MultipleTopBar)findViewById(R.id.topBar);
        topBar.setTopBarClickListener(new TopBarClickListener() {

            @Override
            public void rightBtnClick() {
                // TODO Auto-generated method stub
                Toast.makeText(TestActivity.this, "你點擊的是右邊的按鈕", Toast.LENGTH_LONG).show();
            }

            @Override
            public void leftBtnClick() {
                // TODO Auto-generated method stub
                Toast.makeText(TestActivity.this, "你點擊的是左邊的按鈕", Toast.LENGTH_LONG).show();
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

引用模板的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:custom="http://schemas.android.com/apk/res/com.xys.multiplexedmodule"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".TestActivity" >
    <!--一定要加入引用 xmlns:custom="http://schemas.android.com/apk/res/com.xys.multiplexedmodule"  -->
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical" >

        <com.xys.multiplexedmodule.MultipleTopBar
            android:id="@+id/topBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            custom:leftBackground="@drawable/ic_launcher"
            custom:leftText="左側"
            custom:leftTextColor="#ff0000"
            custom:rightBackground="@drawable/ic_launcher"
            custom:rightText="右側"
            custom:rightTextColor="#ff0000"
            custom:title="自定義標題"
            custom:titleTextColor="#123412"
            custom:titleTextSize="14.0sp" >
        </com.xys.multiplexedmodule.MultipleTopBar>
    </LinearLayout>

</RelativeLayout>

這樣我們就可以使用我們新建的模板控件了,效果如下:

Android UI開發詳解之模板控件的復用

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!