每個(gè)項(xiàng)目都必須處理頭部部分,剛剛開始我們都是在activity布局文件中寫一個(gè)布局然后findViewById去操作。漸漸的我們開始自定義View然后把自定義的頭部寫入布局文件中幾下就可以解決頭部的問題,并且也不用擔(dān)心應(yīng)用版本升級(jí)換風(fēng)格問題。有人說我是用的ToolBar和ActionBar,我想說的是這些也是自定義View你看看源碼就知道,只不過是google給我們的自定義好了,總之這些處理都需要寫在布局文件中且隨著版本升級(jí)擴(kuò)展性并不是特別高。 這一期我們來看一下如何利用Builder設(shè)計(jì)模式構(gòu)建整個(gè)應(yīng)用的NavigationBar,再也不必在activity中寫任何布局,而且一行解決頭部的問題。前提是你必須得了解Builder設(shè)計(jì)模式和泛型,泛型這是基礎(chǔ)大家可以去看看別人寫的文章,至于Builder設(shè)計(jì)模式我上一期就講了Android Builder設(shè)計(jì)模式 - 構(gòu)建整個(gè)項(xiàng)目的萬能Dialog可以先去看看這里,下面我就直接開始寫了。
視頻地址:http://pan.baidu.com/s/1dFuv96p
相關(guān)文章:
2017Android進(jìn)階之路與你同行
Builder設(shè)計(jì)模式 - 構(gòu)建整個(gè)項(xiàng)目的萬能Dialog Builder設(shè)計(jì)模式 - 構(gòu)建整個(gè)應(yīng)用的NavigationBar

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
為了良好的擴(kuò)展性,我們首先構(gòu)建一個(gè)最基礎(chǔ)的導(dǎo)航欄,直接就寫最終效果的哥們我只想說你可能永遠(yuǎn)不了解產(chǎn)品的心里,為了以后我們不去罵娘,我們自己得先去想好退路。
/** * description:添加默認(rèn)的配置 * <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è)置點(diǎn)擊事件 * @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)航條類 這個(gè)類只是定義默認(rèn)的配置 具體功能的實(shí)現(xiàn)一定由具體的實(shí)現(xiàn)類決定 public abstract static class Builder { // 構(gòu)建導(dǎo)航條方法 public abstract AbsNavigation create(); // 默認(rèn)的配置參數(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)建好一個(gè)默認(rèn)通用的NavigationBar去適配98%的效果,至于那些特別奇葩的可以自己去想辦法,可以寫到布局文件中,也可以自己去定義奇葩NavigationBar只要繼承AbsNavigation也是很簡(jiǎn)單的事,這里我就寫一個(gè)內(nèi)涵段子通用的導(dǎo)航欄。
/** * description: 內(nèi)涵段子默認(rèn)導(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; } // 默認(rèn)的配置參數(shù) public static class DefaultNavigationParams extends NavigationParams { //標(biāo)題 public String title; //左邊圖片資源 public int leftIconRes; //右邊圖片資源 public int rightIconRes; //左邊的點(diǎn)擊事件 public View.OnClickListener leftOnClickListener; //右邊的點(diǎn)擊事件 public View.OnClickListener rightOnClickListener; public String leftTv; public String rightTv; public int bgColor; public DefaultNavigationParams(Context context, ViewGroup parent) { super(context, parent); } } }}以后我們?cè)僖膊槐乩侠蠈?shí)實(shí)在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)然如果還是堅(jiān)持findViewById的方式去操作我也不強(qiáng)人所難。后面的再講設(shè)計(jì)模式的時(shí)候可能就不會(huì)單獨(dú)講了,而是好幾種嵌套因?yàn)楹竺娴膬?nèi)容越來越難了,大家做好準(zhǔn)備之前的內(nèi)容沒消化的趕緊消化最主要的還是要自己去敲,最近有收到很多哥們的感謝信我真的會(huì)一直堅(jiān)持下去的,視頻還是老套路只能等周末晚上。
視頻地址:http://pan.baidu.com/s/1dFuv96p
相關(guān)文章:
2017Android進(jìn)階之路與你同行
Android Builder設(shè)計(jì)模式 - 構(gòu)建整個(gè)項(xiàng)目的萬能Dialog
Builder設(shè)計(jì)模式 - 構(gòu)建整個(gè)應(yīng)用的NavigationBar
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注