红橙Darren视频笔记 builder设计模式 navigationbar 导航栏第二版
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 导航栏第二版相关推荐
- 红橙Darren视频笔记 builder设计模式+navigationBar导航条
思路 套用之前的builder设计模式的思路 Product(NavigationBar)+Builder+Parameter 效果: mainActivity代码 @Overrideprotecte ...
- 红橙Darren视频笔记 UML图简介
整体架构复制自红橙原视频的课堂笔记 因为他这一课没有博客,所以没有转载链接,CSDN没有转载地址是无法作为转载类型的文章发表的,暂时标记为原创 参考链接 https://blog.csdn.net/r ...
- 红橙Darren视频笔记 代理模式 动态代理和静态代理
红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...
- 红橙Darren视频笔记 类加载机制(API28) 自己写个热修复 查看源码网站
第一部分 类加载机制 一个Activity是如何被Android虚拟机找到的? 在之前的文章 红橙Darren视频笔记 自定义View总集篇(https://blog.csdn.net/u011109 ...
- 红橙Darren视频笔记 利用阿里巴巴AndFix进行热修复
注意 由于AndFix在2017年左右就停止更新了,在最新版本的apk上遇到很多问题,我最终也没有成功进行热修复.本节主要是学习热修复的原理 在上一篇 红橙Darren视频笔记 自己捕获异常并保存到本 ...
- 红橙Darren视频笔记 Behavior的工作原理源码分析
主要coordinatorlayout的代码来自coordinatorlayout-1.0.0-sources.jar 本文从源码介绍 CoordinatorLayout 的 behavior 怎么工 ...
- 红橙Darren视频笔记 仿QQ侧滑效果
这一篇没有什么新的内容 就是改写 红橙Darren视频笔记 仿酷狗侧滑效果 的侧滑的效果 1.去掉淡入淡出效果 2.加上黑色模板效果 效果: 去掉淡入淡出效果很简单 就是注释掉onScrollChan ...
- 红橙Darren视频笔记 ViewGroup事件分发分析 基于API27
本节目标,通过案例,先看程序运行结果,然后跟踪源码,理解为什么会有这样的输出,继而理解view group的分发机制,感觉和证明题很像呢. 考虑以下程序的运行结果: case1: public cla ...
- 红橙Darren视频笔记 万能Dialog builder设计模式
1.Android原生的AlertDialog 我们今天看一下AlertDialog的创建方式以及它使用到的builder设计模式 我们先看看原生Android的AlertDialog创建方式: Al ...
最新文章
- php页面最大执行时间 set_time_limit函数不起作用
- 域控服务器状态检查和标准备份
- Java登陆页面经常出现的问题,问一下关于登陆页面的有关问题
- reverseString
- w10查询自己电脑ip
- linux常用命令之权限
- Iphone代码创建视图
- oracle函数分为几个大类,ORACLE常见分析函数有哪几类呢?
- Jquery重新学习之七[Ajax运用总结A]
- ssm框架逻辑删除mysql_ssm框架小总结——批量删除
- 实习生有年终奖吗_“辞职,一定要赶在发年终奖前!”为什么我建议你一定要年前跳槽...
- 【分布式架构】企业级分布式应用服务EDAS使用攻略(上篇)
- qt调用import sys库_QTCreator调用动态库实例
- 【一分钟论文】 NAACL2019-使用感知句法词表示的句法增强神经机器翻译
- Debit credit problem
- karto探秘之slam_karto
- java web导出excel表格,java 网页导出excel表格数据-java 将页面内容写入excel文件中并可以将其下载到......
- 伺服驱动器上UVW电机动力线相序接错
- 2021测试开发面试题大全及答案(包含测试基础|接口测试|自动化测试...)【289页】
- TeamViewer 可信设备的信任管理
热门文章
- android 数字圆环,Android 自定义数字圆环
- Element表单验证(2)
- POJ 2482 Stars in Your Window(线段树)
- Ant学习---第一节:Ant安装和简单使用
- js添加事件、移除事件、阻止冒泡、阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 转载...
- leetcode 95 python
- 数据结构—链表-单链表应用-拆分链表
- 什么叫做java程序中的继承_【Java】基础16:什么叫继承?
- flyway版本号_Spring Boot 集成 Flyway 实现数据库版本控制
- java代码创建jar_Java 创建ZIP和JAR文件