android開發中標題欄的封裝

一 首先,我們看看下面這幾張圖片,找找其中有什麼共同之處?不知道大家有沒有發現在這幾張圖片中,title的位置基本上是一樣的,中間的文字在改變,或者是兩邊的按鈕由圖片換成了文字。

圖1圖2圖3圖4圖5

二 上面這種情況相信大家在項目中都有遇到,那麼遇到這種情況最普遍的寫法是什麼呢?是不是如下面代碼所述的寫法?

1.公用title文件e_top_title.xml代碼:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/title_bar"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#1A7DEB">

    <ImageView
        android:id="@+id/title_left_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_gravity="center"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:src="@drawable/layout_top_back"
        android:visibility="gone" />

    <TextView
        android:id="@+id/title_left_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:text="取消"
        android:textColor="#ffffff"
        android:textSize="17sp"
        android:visibility="gone" />

    <TextView
        android:visibility="gone"
        android:id="@+id/title_middle_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:maxWidth="224dp"
        android:singleLine="true"
        android:text="設置"
        android:textColor="#ffffff"
        android:textSize="20sp"/>

    <TextView
        android:id="@+id/title_right_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:text="完成"
        android:textColor="#ffffff"
        android:textSize="17sp"
        android:visibility="gone" />

    <ImageView
        android:id="@+id/title_right_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_gravity="center"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:src="@drawable/layout_right_menu"
        android:visibility="gone" />

</RelativeLayout>
2.主配置文件activity_main.xml代碼示例:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/e_top_title"/>

    <LinearLayout
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:textSize="20sp"
            android:text="Other widget view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

</RelativeLayout>
3.在主Activity方法中的代碼示例:
package com.example.admin.pottingtitle;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    /**
     * 左邊圖片按鈕
     */
    private ImageView title_left_imageview;
    /**
     * 左邊文字按鈕
     */
    private TextView title_left_textview;
    /**
     * 中間顯示文字
     */
    private TextView title_middle_textview;
    /**
     * 右邊文字按鈕
     */
    private TextView title_right_textview;
    /**
     * 右邊圖片按鈕
     */
    private ImageView title_right_imageview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        setIsVisible();
        setListener();
    }

    /**
     * 初始化控件
     */
    private void initView()
    {

        title_left_imageview = (ImageView) findViewById(R.id.title_left_imageview);
        title_left_textview = (TextView) findViewById(R.id.title_left_textview);
        title_middle_textview = (TextView) findViewById(R.id.title_middle_textview);
        title_right_textview = (TextView) findViewById(R.id.title_right_textview);
        title_right_imageview = (ImageView) findViewById(R.id.title_right_imageview);

    }

    /**
     * 設置某個是否顯示
     */
    private void setIsVisible() {
        /**
         * 1.因爲在配置文件中設置的是默認全部隱藏
         * 2.因此在這裏直接設置顯示,然後在進行配置即可
         * 3.中間的TextView沒有設置隱藏,因此這裏不用設置(可根據自己的需要進行配置)
         */
        title_left_imageview.setVisibility(View.VISIBLE);
        title_left_imageview.setImageResource(R.drawable.layout_top_back);

        title_middle_textview.setText("個人中心");

        title_right_imageview.setVisibility(View.VISIBLE);
        title_right_imageview.setImageResource(R.drawable.layout_right_menu);

    }

    /**
     * 設置點擊事件
     */
    private void setListener()
    {

        title_left_imageview.setOnClickListener(this);
        title_left_textview.setOnClickListener(this);
        title_right_textview.setOnClickListener(this);
        title_right_imageview.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {


        switch (v.getId())
        {
            /**
             * 根據不同的按鈕點擊進行相應的操作
             * 1.這裏也可根據上面設定的顯示進行事件的監聽,這裏只做演示使用
             */
            case R.id.title_left_imageview:
                break;
            case R.id.title_left_textview:
                break;
            case R.id.title_right_textview:
                break;
            case R.id.title_right_imageview:
                break;

        }

    }
}
4.那麼在你的代碼中是不是這樣寫的呢?當然不是說這種方法不可以,其實也是可以的,但是若是要你在每個Activity中都把這些代碼重新寫一遍,你覺得這樣好嗎?下面利用例子給大家講解一個封裝的方法。

三 title的封裝。

1.在這裏我們新建了一個工程,工程的目錄結構如下:

工程結構

2.util包下的TitleBuilder.java類的代碼如下:
package com.example.admin.pottitle.util;

import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.admin.pottitle.R;


/**
 * Created by comeyi on 2015/7/17.
 */
public class TitleBuilder {

    /**
     * title欄根佈局
     */
    private View titleView;
    private TextView left_textview;
    private ImageView left_imageview;
    private TextView middle_textview;
    private TextView right_textview;
    private ImageView right_imageview;

    /**
     * 第一種  初始化方式
     * 這裏是直接引用進文件的初始化方式
     * @param context
     */
    public TitleBuilder(Activity context) {

        titleView = context.findViewById(R.id.title_bar);

        left_textview = (TextView) titleView.findViewById(R.id.title_left_textview);
        left_imageview = (ImageView) titleView.findViewById(R.id.title_left_imageview);

        middle_textview = (TextView) titleView.findViewById(R.id.title_middle_textview);

        right_textview = (TextView) titleView.findViewById(R.id.title_right_textview);
        right_imageview = (ImageView) titleView.findViewById(R.id.title_right_imageview);

    }

    /**
     * 第二種初始化方式
     * 這裏是比如你用代碼創建佈局的時候使用
     * @param context
     */
    public TitleBuilder(View context) {

        titleView = context.findViewById(R.id.title_bar);

        left_textview = (TextView) titleView.findViewById(R.id.title_left_textview);
        left_imageview = (ImageView) titleView.findViewById(R.id.title_left_imageview);

        middle_textview = (TextView) titleView.findViewById(R.id.title_middle_textview);

        right_textview = (TextView) titleView.findViewById(R.id.title_right_textview);
        right_imageview = (ImageView) titleView.findViewById(R.id.title_right_imageview);

    }

    /**
     * title 的背景色
     */

    public TitleBuilder setMiddleTitleBgRes(int resid) {

        middle_textview.setBackgroundResource(resid);

        return this;
    }
    /**
     * title的文本
     *
     * @param text
     * @return
     */
    public TitleBuilder setMiddleTitleText(String text) {

        middle_textview.setVisibility(TextUtils.isEmpty(text) ? View.GONE
                : View.VISIBLE);
        middle_textview.setText(text);

        return this;
    }

    /**
     * left
     */
    /**
     * 圖片按鈕
     *
     * @param resId
     * @return
     */
    public TitleBuilder setLeftImageRes(int resId) {

        left_imageview.setVisibility(resId > 0 ? View.VISIBLE : View.GONE);
        left_imageview.setImageResource(resId);

        return this;
    }

    /**
     * 左邊文字按鈕
     *
     * @param text
     * @return
     */
    public TitleBuilder setLeftText(String text) {

        left_textview.setVisibility(TextUtils.isEmpty(text) ? View.GONE:View.VISIBLE);
        left_textview.setText(text);

        return this;
    }

    /**
     * 設置左邊的事件
     */
    public TitleBuilder setLeftTextOrImageListener(View.OnClickListener listener) {

        if (left_imageview.getVisibility() == View.VISIBLE) {

            left_imageview.setOnClickListener(listener);

        } else if (left_textview.getVisibility() == View.VISIBLE) {

            left_textview.setOnClickListener(listener);

        }

        return this;
    }

    /**
     * right
     */
    /**
     * 右邊圖片按鈕
     *
     * @param resId
     * @return
     */
    public TitleBuilder setRightImageRes(int resId) {

        right_imageview.setVisibility(resId > 0 ? View.VISIBLE : View.GONE);
        right_imageview.setImageResource(resId);

        return this;
    }

    /**
     * 右邊文字按鈕
     *
     * @param text
     * @return
     */
    public TitleBuilder setRightText(String text) {

        right_textview.setVisibility(TextUtils.isEmpty(text) ? View.GONE:View.VISIBLE);
        right_textview.setText(text);

        return this;
    }

    /**
     * 設置右邊的事件
     */
    public TitleBuilder setRightTextOrImageListener(View.OnClickListener listener) {

        if (right_imageview.getVisibility() == View.VISIBLE) {

            right_imageview.setOnClickListener(listener);

        } else if (right_textview.getVisibility() == View.VISIBLE) {

            right_textview.setOnClickListener(listener);

        }

        return this;
    }

    public View build(){

        return titleView;
    }

}

3.相信看過DialogBuilder類的小夥伴都能看得懂上面的代碼,在設置完成後然後返回其本身,這樣就可以在用的時候實現一直 "." 方法然後一直無限設置。
4.在本工程中e_top_title.xml與上面給出的代碼一致,因此在這裏就不貼出來了。
5.下面來看看在具體代碼中的使用:
(1).activity_main.xml中的引用代碼如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <include layout="@layout/e_top_title"></include>


    <TextView
        android:textSize="20sp"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_world" />

</RelativeLayout>
(2).在主Activity中的使用方法如下:
package com.example.admin.pottitle;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.example.admin.pottitle.util.TitleBuilder;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * 初始化標題
          */
        initTitle();


    }

    private void initTitle() {
        /**
         * 1.設置左邊的圖片按鈕顯示,以及事件
         * 2.設置中間TextView顯示的文字
         * 3.設置右邊的圖片按鈕顯示,並設置事件
         */
        new TitleBuilder(this).setLeftImageRes(R.drawable.layout_top_back)
                .setLeftTextOrImageListener(leftCilckListener)
                .setMiddleTitleText("個人中心")
                .setRightImageRes(R.drawable.layout_right_menu)
                .setRightTextOrImageListener(rightCilckListener);

    }


    private View.OnClickListener leftCilckListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            /**
             * 也可根據上面的配置進行監聽 此處做演示使用
             */
            if (v.getId() == R.id.title_left_imageview)
            {
                /**
                 * 圖片按鈕
                 */
            }
            else
            {
                /**
                 * 文字按鈕
                 */
            }
        }
    };
    private View.OnClickListener rightCilckListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (v.getId() == R.id.title_right_imageview)
            {
                /**
                 * 右邊圖片
                 */
            }
            else
            {
                /**
                 * 右邊文字
                 */
            }

        }
    };
}
(4).怎麼樣?是不是比剛纔那種寫法要簡便的多,而且代碼也比較少,更適用於在每個界面都使用,而且靈活性也大了許多,可能你也許還不理解在TitleBuilder中怎麼實現的,那麼下面我就講解一下里面具體的方法。

四 TitleBuilder詳解。

1.在上面的代碼中可以看到在該類中一共有11個方法,那麼在此我只對其中的個別進行解解。
2.初始化方法:
    (1).TitleBuilder(Activity context),對控件進行初始化,適用於在主配置文件中直接引用過標題文件的類。
/**
     * 第一種  初始化方式
     * 這裏是直接引用進文件的初始化方式
     * @param context
     */
    public TitleBuilder(Activity context) {

        titleView = context.findViewById(R.id.title_bar);

        left_textview = (TextView) titleView.findViewById(R.id.title_left_textview);
        left_imageview = (ImageView) titleView.findViewById(R.id.title_left_imageview);

        middle_textview = (TextView) titleView.findViewById(R.id.title_middle_textview);

        right_textview = (TextView) titleView.findViewById(R.id.title_right_textview);
        right_imageview = (ImageView) titleView.findViewById(R.id.title_right_imageview);

    }
(2).TitleBuilder(View context),也會對控件初始化,此方法適用於在代碼中構造界面時使用。
/**
     * 第二種初始化方式
     * 這裏是比如你用代碼創建佈局的時候使用
     * @param context
     */
    public TitleBuilder(View context) {

        titleView = context.findViewById(R.id.title_bar);

        left_textview = (TextView) titleView.findViewById(R.id.title_left_textview);
        left_imageview = (ImageView) titleView.findViewById(R.id.title_left_imageview);

        middle_textview = (TextView) titleView.findViewById(R.id.title_middle_textview);

        right_textview = (TextView) titleView.findViewById(R.id.title_right_textview);
        right_imageview = (ImageView) titleView.findViewById(R.id.title_right_imageview);

    }
3.setMiddleTitleBgRes(int resid)該方法主要用於設置title的背景色。可能每個title的風格相似,當時背景色不一致。
/**
     * title 的背景色
     */

    public TitleBuilder setMiddleTitleBgRes(int resid) {

        middle_textview.setBackgroundResource(resid);

        return this;
    }
4.TitleBuilder setMiddleTitleText(String text)設置title中間提示的文字。可以看出來,這裏首先進行了非空的判斷。
/**
     * title的文本
     *
     * @param text
     * @return
     */
    public TitleBuilder setMiddleTitleText(String text) {

        middle_textview.setVisibility(TextUtils.isEmpty(text) ? View.GONE
                : View.VISIBLE);
        middle_textview.setText(text);

        return this;
    }
5.TitleBuilder setLeftImageRes(int resId)設置左邊的圖片按鈕的圖片資源信息,在方法中進行了判斷,若沒有設置則隱藏該控件。
/**
     * left
     */
    /**
     * 圖片按鈕
     *
     * @param resId
     * @return
     */
    public TitleBuilder setLeftImageRes(int resId) {

        left_imageview.setVisibility(resId > 0 ? View.VISIBLE : View.GONE);
        left_imageview.setImageResource(resId);

        return this;
    }
6.TitleBuilder setLeftText(String text)設置左邊的文字按鈕的信息,若爲空的話則隱藏,表示未設置。
/**
     * 左邊文字按鈕
     *
     * @param text
     * @return
     */
    public TitleBuilder setLeftText(String text) {

        left_textview.setVisibility(TextUtils.isEmpty(text) ? View.GONE:View.VISIBLE);
        left_textview.setText(text);

        return this;
    }
7.TitleBuilder setLeftTextOrImageListener(View.OnClickListener listener)設置左邊的事件點擊信息,首先判斷左邊的那個控件是顯示狀態,然後對其進行事件的綁定。
/**
     * 設置左邊的事件
     */
    public TitleBuilder setLeftTextOrImageListener(View.OnClickListener listener) {

        if (left_imageview.getVisibility() == View.VISIBLE) {

            left_imageview.setOnClickListener(listener);

        } else if (left_textview.getVisibility() == View.VISIBLE) {

            left_textview.setOnClickListener(listener);

        }

        return this;
    }
8.右邊的設置跟左邊的基本一致,感興趣的朋友可以再研究下,另外這裏類封裝的也比較簡單,方法比較少,你可以根據自己的需要再添加方法。

在此特別感謝 凡塵 代碼中由於本人的疏忽導致有一個bug,現在也已進行修復 若您已經下載了舊的資源那麼請您按下圖中的展示進行修改:

這裏寫圖片描述

新的資源下載鏈接如下:

代碼下載

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