一 首先,我們看看下面這幾張圖片,找找其中有什麼共同之處?不知道大家有沒有發現在這幾張圖片中,title的位置基本上是一樣的,中間的文字在改變,或者是兩邊的按鈕由圖片換成了文字。
二 上面這種情況相信大家在項目中都有遇到,那麼遇到這種情況最普遍的寫法是什麼呢?是不是如下面代碼所述的寫法?
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,現在也已進行修復 若您已經下載了舊的資源那麼請您按下圖中的展示進行修改:
新的資源下載鏈接如下: