1. 概述
每個項目都必須處理頭部部分,剛剛開始我們都是在activity布局文件中寫一個布局然后findViewById去操作罐韩。漸漸的我們開始自定義View然后把自定義的頭部寫入布局文件中幾下就可以解決頭部的問題甚脉,并且也不用擔(dān)心應(yīng)用版本升級換風(fēng)格問題滚澜。有人說我是用的ToolBar和ActionBar蓉媳,我想說的是這些也是自定義View你看看源碼就知道八酒,只不過是google給我們的自定義好了空民,總之這些處理都需要寫在布局文件中且隨著版本升級擴展性并不是特別高。
這一期我們來看一下如何利用Builder設(shè)計模式構(gòu)建整個應(yīng)用的NavigationBar羞迷,再也不必在activity中寫任何布局界轩,而且一行解決頭部的問題。前提是你必須得了解Builder設(shè)計模式和泛型衔瓮,泛型這是基礎(chǔ)大家可以去看看別人寫的文章浊猾,至于Builder設(shè)計模式我上一期就講了Android Builder設(shè)計模式 - 構(gòu)建整個項目的萬能Dialog可以先去看看這里,下面我就直接開始寫了热鞍。
視頻地址:http://pan.baidu.com/s/1dFuv96p
相關(guān)文章:
Builder設(shè)計模式 - 構(gòu)建整個項目的萬能Dialog
Builder設(shè)計模式 - 構(gòu)建整個應(yīng)用的NavigationBar
2. 實現(xiàn)
2.1 定義導(dǎo)航條規(guī)范
**
* description:定義導(dǎo)航條規(guī)范
*
* Created by 曾輝 on 2016/6/30 22:35
* QQ:240336124
* Email: 240336124@qq.com
* Version:1.0
*/
public interface INavigation {
// 綁定布局ID
public int bindLayoutId();
// 給View設(shè)置參數(shù)
public void applyView();
}
2.2 構(gòu)建AbsNavigationBar
為了良好的擴展性葫慎,我們首先構(gòu)建一個最基礎(chǔ)的導(dǎo)航欄,直接就寫最終效果的哥們我只想說你可能永遠不了解產(chǎn)品的心里薇宠,為了以后我們不去罵娘偷办,我們自己得先去想好退路。
/**
* description:添加默認的配置
* <p>
* Created by 曾輝 on 2016/6/30 22:35
* QQ:240336124
* Email: 240336124@qq.com
* Version:1.0
*/
public abstract class AbsNavigationBar<P extends AbsNavigationBar.Builder.NavigationParams> implements INavigation {
private P params;
private View view;
public AbsNavigationBar(P params) {
this.params = params;
createAndBind();
}
protected String getString(int id) {
return this.params.context.getResources().getString(id);
}
protected int getColor(int id) {
return ContextCompat.getColor(this.params.context, id);
}
protected P getParams() {
return params;
}
/**
* 設(shè)置文本
* @param viewId
* @param text
*/
protected void setText(int viewId, CharSequence text) {
TextView tv = findViewById(viewId);
if (tv != null) {
tv.setText(text);
}
}
/**
* 設(shè)置點擊事件
* @param viewId
* @param listener
*/
protected void setOnClickListener(int viewId, View.OnClickListener listener) {
View view = findViewById(viewId);
if (view != null) {
view.setOnClickListener(listener);
}
}
/**
* 設(shè)置背景資源
* @param viewId
* @param resourceId
*/
protected void setImageResource(int viewId, int resourceId) {
ImageView imageView = findViewById(viewId);
if (imageView != null) {
imageView.setImageResource(resourceId);
}
}
protected <T extends View> T findViewById(int id) {
return (T) view.findViewById(id);
}
/**
* 創(chuàng)建和綁定布局
*/
public void createAndBind() {
if (params == null) {
return;
}
view = LayoutInflater.from(params.context).inflate(bindLayoutId(), params.parent, false);
params.parent.addView(view, 0);
applyView();
}
// 構(gòu)建導(dǎo)航條類 這個類只是定義默認的配置 具體功能的實現(xiàn)一定由具體的實現(xiàn)類決定
public abstract static class Builder {
// 構(gòu)建導(dǎo)航條方法
public abstract AbsNavigation create();
// 默認的配置參數(shù)
public static class NavigationParams {
public Context context;
public ViewGroup parent;
public NavigationParams(Context context, ViewGroup parent) {
this.context = context;
this.parent = parent;
}
}
}
}
2.2 構(gòu)建DefaultNavigationBar
我們構(gòu)建好一個默認通用的NavigationBar去適配98%的效果澄港,至于那些特別奇葩的可以自己去想辦法椒涯,可以寫到布局文件中,也可以自己去定義奇葩NavigationBar只要繼承AbsNavigation也是很簡單的事回梧,這里我就寫一個內(nèi)涵段子通用的導(dǎo)航欄逐工。
/**
* description: 內(nèi)涵段子默認導(dǎo)航欄
* <p>
* Created by 曾輝 on 2016/6/30 22:35
* QQ:240336124
* Email: 240336124@qq.com
* Version:1.0
*/
public class DefaultNavigation<D extends AbsNavigation.Builder.NavigationParams> extends
AbsNavigation<DefaultNavigation.Builder.DefaultNavigationParams> {
public DefaultNavigation(Builder.DefaultNavigationParams params) {
super(params);
}
@Override
public void applyView() {
// 給我們的導(dǎo)航條綁定資源
setImageResource(R.id.iv_left, getParams().leftIconRes);
setImageResource(R.id.iv_right, getParams().rightIconRes);
setImageResource(R.id.iv_right_icon, getParams().textRightIconRes);
setText(R.id.title_tv, getParams().title);
setText(R.id.left_tv, getParams().leftTv);
setText(R.id.right_tv, getParams().rightTv);
setBackgroundColor(R.id.title_bar, getParams().bgColor);
setOnClickListener(R.id.left_ll, getParams().leftOnClickListener);
setOnClickListener(R.id.right_ll, getParams().rightOnClickListener);
}
@Override
public int bindLayoutId() {
// 綁定布局layoutId
return R.layout.navigation_default;
}
// 構(gòu)建導(dǎo)航條類
public static class Builder extends AbsNavigation.Builder {
private DefaultNavigationParams params;
public Builder(Context context, ViewGroup parent) {
params = new DefaultNavigationParams(context, parent);
}
public Builder setTitle(String title) {
params.title = title;
return this;
}
public Builder setRight(String right) {
params.rightTv = right;
return this;
}
public Builder setLeft(String left) {
params.leftTv = left;
return this;
}
public Builder setLeftIcon(int iconRes) {
params.leftIconRes = iconRes;
return this;
}
public Builder setRightIcon(int iconRes) {
params.rightIconRes = iconRes;
return this;
}
public Builder setTitleBackgroundColor(int bgColor) {
params.bgColor = bgColor;
return this;
}
public Builder setLeftOnClickListener(View.OnClickListener onClickListener) {
params.leftOnClickListener = onClickListener;
return this;
}
public Builder setRightOnClickListener(View.OnClickListener onClickListener) {
params.rightOnClickListener = onClickListener;
return this;
}
@Override
public DefaultNavigation<NavigationParams> create() {
DefaultNavigation<NavigationParams> navigation = new DefaultNavigation<NavigationParams>(params);
return navigation;
}
// 默認的配置參數(shù)
public static class DefaultNavigationParams extends NavigationParams {
//標題
public String title;
//左邊圖片資源
public int leftIconRes;
//右邊圖片資源
public int rightIconRes;
//左邊的點擊事件
public View.OnClickListener leftOnClickListener;
//右邊的點擊事件
public View.OnClickListener rightOnClickListener;
public String leftTv;
public String rightTv;
public int bgColor;
public DefaultNavigationParams(Context context, ViewGroup parent) {
super(context, parent);
}
}
}
}
3. 見證奇跡的時刻
以后我們再也不必老老實實在activity布居中屁顛屁顛的去寫了,只需要在Activity代碼中寫短短的寫一行代碼就可以了:
DefaultNavigationBar navigationBar = new DefaultNavigation.Builder(this,
(ViewGroup) findViewById(android.R.id.content))
.setLeftIcon(R.drawable.common_back).setTitle("投稿").setRightText("發(fā)表").create();
以后再寫頭部這樣子寫就可以了漂辐,當(dāng)然如果還是堅持findViewById的方式去操作我也不強人所難。后面的再講設(shè)計模式的時候可能就不會單獨講了棕硫,而是好幾種嵌套因為后面的內(nèi)容越來越難了髓涯,大家做好準備之前的內(nèi)容沒消化的趕緊消化最主要的還是要自己去敲,最近有收到很多哥們的感謝信我真的會一直堅持下去的哈扮,視頻還是老套路只能等周末晚上纬纪。
視頻地址:http://pan.baidu.com/s/1dFuv96p
相關(guān)文章: