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

本文主要是介绍红橙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 导航栏第二版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016224

相关文章

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [