1.builder设计模式简介

builder的实际应用的典型案例有AlertDialog和OKHttp

例如

    // AlertDialogAlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).setTitle("标题").setNegativeButton("取消", (dialog, which) -> {dialog.dismiss();Toast.makeText(MainActivity.this, "点击了取消", Toast.LENGTH_SHORT).show();}).setPositiveButton("确定", (dialog, which) -> Toast.makeText(MainActivity.this, "点击了确定", Toast.LENGTH_SHORT).show()).setCancelable(false).setIcon(R.drawable.ic_launcher_background).setMessage("这是消息这是消息这是消息这是消息").setView(button).create();alertDialog.show();// OKhttpprivate void doOKHttpGet() {Runnable runnable = () -> {String response = "";try {response = getRequest("https://raw.github.com/square/okhttp/master/README.md");} catch (IOException e) {Log.d(TAG, e.getMessage());e.printStackTrace();}Log.d(TAG, "doOKHttpGet: " + response);};Thread thread = new Thread(runnable);thread.start();}String getRequest(String url) throws IOException {Request request = new Request.Builder().url(url).build();try (Response response = client.newCall(request).execute()) {return response.body().string();}}

建造者模式通常用于创建较复杂对象,例如上面两种情况 都是参数有很多 且有参数是可有可无的情况

之前写过一些类似的文章

下面这篇是利用builder设计模式模仿Android AlertDialog写的自己自定义的Dialog

https://blog.csdn.net/u011109881/article/details/114336196

下面这篇是利用builder设计模式 进一步写导航条

https://blog.csdn.net/u011109881/article/details/114548479

上面的两篇类结构比较简单 还有稍微复杂的建造者demo

https://blog.csdn.net/u011109881/article/details/57182402

2.导航栏升级版

利用builder设计模式写导航栏

2.1 接口类INavigation

public interface INavigation {void createNavigationBar();void attachNavigationParams();//TextView findViewById(int viewId);void attachParent(View navigationBar, ViewGroup parent);//AbsNavigationBar.Builder getBuilder();
}

2.2 抽象类AbsNavigationBar

public abstract class AbsNavigationBar <B extends AbsNavigationBar.Builder> implements INavigation {private final B mBuilder;private View mNavigationBar;protected AbsNavigationBar(B builder) {this.mBuilder = builder;createNavigationBar();}@Overridepublic void createNavigationBar() {mNavigationBar = LayoutInflater.from(mBuilder.mContext).inflate(mBuilder.mLayoutId, mBuilder.mParent, false);// 实际上false改成true可以不用调用下面attachParent的方法// 将布局添加到父容器attachParent(mNavigationBar, mBuilder.mParent);// 绑定参数到Builder内部attachNavigationParams();}// 利用AbsNavigationBar引用绑定参数到AbsNavigationBar内部类Builder@Overridepublic void attachNavigationParams() {// 设置文本Map<Integer, CharSequence> textMaps = mBuilder.mTextMaps;for (Map.Entry<Integer, CharSequence> entry : textMaps.entrySet()) {TextView textView = findViewById(entry.getKey());if (textView == null) {throw new IllegalArgumentException("TextView should not be null");}textView.setText(entry.getValue());}// 设置点击事件Map<Integer, View.OnClickListener> clickListenerMaps = mBuilder.mClickListenerMaps;for (Map.Entry<Integer, View.OnClickListener> entry : clickListenerMaps.entrySet()) {View view = findViewById(entry.getKey());if (view == null) {throw new IllegalArgumentException("view should not be null");}view.setOnClickListener(entry.getValue());}}@Overridepublic void attachParent(View navigationBar, ViewGroup parent) {parent.addView(navigationBar, 0);}// 返回泛型类型 前面的T是泛型声明 后面的T是返回类型protected  <T extends View> T findViewById(int viewId) {return mNavigationBar.findViewById(viewId);}protected B getBuilder() {return mBuilder;}/*** 构建类 主要任务是存储参数*/public static abstract class Builder<B extends Builder> {// 类泛型 里面用到泛型B 继承自当前的内部类builderpublic Context mContext;public int mLayoutId;public ViewGroup mParent;public Map<Integer, CharSequence> mTextMaps;public Map<Integer, View.OnClickListener> mClickListenerMaps;public Builder(Context context, int layoutId, ViewGroup parent) {this.mContext = context;this.mLayoutId = layoutId;this.mParent = parent;this.mTextMaps = new HashMap<>();this.mClickListenerMaps = new HashMap<>();}// 创建NavigationBarpublic abstract AbsNavigationBar create();// 利用builder设置文本public B setText(int viewId, String text) {mTextMaps.put(viewId, text);return (B) this;}// 利用builder设置点击事件public B setOnClickListener(int viewId, View.OnClickListener clickListener) {mClickListenerMaps.put(viewId, clickListener);return (B) this;}}
}

2.3 具体实现类1 NavigationBar

public class NavigationBar extends AbsNavigationBar{protected NavigationBar(Builder builder) {super(builder);}public static class Builder extends AbsNavigationBar.Builder<NavigationBar.Builder> {// 这里的泛型覆盖父类中的泛型(父类中泛化 子类中具现) 使得setText setOnClickListener返回的B为NavigationBar.Builderpublic Builder(Context context, int layoutId, ViewGroup parent) {super(context, layoutId, parent);}@Overridepublic NavigationBar create() {return new NavigationBar(this);}}
}

2.4 具体实现类2 DefaultNavigationBar

public class DefaultNavigationBar extends AbsNavigationBar<DefaultNavigationBar.Builder>{protected DefaultNavigationBar(Builder builder) {super(builder);}@Overridepublic void attachNavigationParams() {super.attachNavigationParams();TextView leftView = findViewById(R.id.back_tv);leftView.setVisibility(getBuilder().mLeftVisible);// 这里能够访问到mLeftVisible 因为getBuilder返回的是泛型类型// DefaultNavigationBar extends AbsNavigationBar<DefaultNavigationBar.Builder> 具现化了B为DefaultNavigationBar.Builder// 因此 getBuilder()返回的是DefaultNavigationBar.Builder 能够调用mLeftVisible变量}public static class Builder extends AbsNavigationBar.Builder<DefaultNavigationBar.Builder>{public int mLeftVisible = View.VISIBLE;public Builder(Context context, ViewGroup parent) {super(context, R.layout.defualt_navigation_bar, parent);}public Builder setLeftText(String text){setText(R.id.back_tv,text);return this;}public Builder setLeftClickListener(View.OnClickListener clickListener){setOnClickListener(R.id.back_tv,clickListener);return this;}public Builder hideLeftText() {mLeftVisible = View.INVISIBLE;return this;}@Overridepublic DefaultNavigationBar create() {return new DefaultNavigationBar(this);}}
}

2.5 使用到的布局

//activity_main<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/view_root"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"/></RelativeLayout>//defualt_navigation_bar
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:id="@+id/view_root"android:background="#ccc"android:layout_height="wrap_content"><TextViewandroid:id="@+id/back_tv"android:textColor="@android:color/white"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="default bar" /></androidx.appcompat.widget.Toolbar>//navigationbar
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/design_default_color_secondary"android:paddingTop="10dp"android:paddingBottom="10dp"tools:context=".MainActivity"><TextViewandroid:id="@+id/left_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:textColor="@color/white" /><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:text="Hello World!"android:textColor="@color/white" /><ImageViewandroid:id="@+id/right_icon"android:layout_width="20dp"android:layout_height="20dp"android:layout_alignParentEnd="true"android:src="@drawable/ic_launcher_background" />
</RelativeLayout>

另外注意需要将application的主题设置为android:theme="@style/Theme.Design.Light.NoActionBar"

课程里面说是导航栏的升级版,但个人感觉不出哪里升级了- -! 要说有变化的化 主要是用到了一些泛型在继承上面的一些高级用法,需要多花时间琢磨琢磨

红橙Darren视频笔记 builder设计模式 navigationbar 导航栏第二版相关推荐

  1. 红橙Darren视频笔记 builder设计模式+navigationBar导航条

    思路 套用之前的builder设计模式的思路 Product(NavigationBar)+Builder+Parameter 效果: mainActivity代码 @Overrideprotecte ...

  2. 红橙Darren视频笔记 UML图简介

    整体架构复制自红橙原视频的课堂笔记 因为他这一课没有博客,所以没有转载链接,CSDN没有转载地址是无法作为转载类型的文章发表的,暂时标记为原创 参考链接 https://blog.csdn.net/r ...

  3. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  4. 红橙Darren视频笔记 类加载机制(API28) 自己写个热修复 查看源码网站

    第一部分 类加载机制 一个Activity是如何被Android虚拟机找到的? 在之前的文章 红橙Darren视频笔记 自定义View总集篇(https://blog.csdn.net/u011109 ...

  5. 红橙Darren视频笔记 利用阿里巴巴AndFix进行热修复

    注意 由于AndFix在2017年左右就停止更新了,在最新版本的apk上遇到很多问题,我最终也没有成功进行热修复.本节主要是学习热修复的原理 在上一篇 红橙Darren视频笔记 自己捕获异常并保存到本 ...

  6. 红橙Darren视频笔记 Behavior的工作原理源码分析

    主要coordinatorlayout的代码来自coordinatorlayout-1.0.0-sources.jar 本文从源码介绍 CoordinatorLayout 的 behavior 怎么工 ...

  7. 红橙Darren视频笔记 仿QQ侧滑效果

    这一篇没有什么新的内容 就是改写 红橙Darren视频笔记 仿酷狗侧滑效果 的侧滑的效果 1.去掉淡入淡出效果 2.加上黑色模板效果 效果: 去掉淡入淡出效果很简单 就是注释掉onScrollChan ...

  8. 红橙Darren视频笔记 ViewGroup事件分发分析 基于API27

    本节目标,通过案例,先看程序运行结果,然后跟踪源码,理解为什么会有这样的输出,继而理解view group的分发机制,感觉和证明题很像呢. 考虑以下程序的运行结果: case1: public cla ...

  9. 红橙Darren视频笔记 万能Dialog builder设计模式

    1.Android原生的AlertDialog 我们今天看一下AlertDialog的创建方式以及它使用到的builder设计模式 我们先看看原生Android的AlertDialog创建方式: Al ...

最新文章

  1. php页面最大执行时间 set_time_limit函数不起作用
  2. 域控服务器状态检查和标准备份
  3. Java登陆页面经常出现的问题,问一下关于登陆页面的有关问题
  4. reverseString
  5. w10查询自己电脑ip
  6. linux常用命令之权限
  7. Iphone代码创建视图
  8. oracle函数分为几个大类,ORACLE常见分析函数有哪几类呢?
  9. Jquery重新学习之七[Ajax运用总结A]
  10. ssm框架逻辑删除mysql_ssm框架小总结——批量删除
  11. 实习生有年终奖吗_“辞职,一定要赶在发年终奖前!”为什么我建议你一定要年前跳槽...
  12. 【分布式架构】企业级分布式应用服务EDAS使用攻略(上篇)
  13. qt调用import sys库_QTCreator调用动态库实例
  14. 【一分钟论文】 NAACL2019-使用感知句法词表示的句法增强神经机器翻译
  15. Debit credit problem
  16. karto探秘之slam_karto
  17. java web导出excel表格,java 网页导出excel表格数据-java 将页面内容写入excel文件中并可以将其下载到......
  18. 伺服驱动器上UVW电机动力线相序接错
  19. 2021测试开发面试题大全及答案(包含测试基础|接口测试|自动化测试...)【289页】
  20. TeamViewer 可信设备的信任管理

热门文章

  1. android 数字圆环,Android 自定义数字圆环
  2. Element表单验证(2)
  3. POJ 2482 Stars in Your Window(线段树)
  4. Ant学习---第一节:Ant安装和简单使用
  5. js添加事件、移除事件、阻止冒泡、阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 转载...
  6. leetcode 95 python
  7. 数据结构—链表-单链表应用-拆分链表
  8. 什么叫做java程序中的继承_【Java】基础16:什么叫继承?
  9. flyway版本号_Spring Boot 集成 Flyway 实现数据库版本控制
  10. java代码创建jar_Java 创建ZIP和JAR文件