• Android 链式调用组件(以标题栏为例)


    恭喜自己的 android注解上2022/11/07的推荐

    浏览器ctrl+f 搜索 艾特猫  就可以看到我的被推荐笔记

    https://bbs.csdn.net/topics/609019461?utm_medium=notify.im.blog_rank_weekly.a&username=u014071104

    话说n年前,jquery大行其道的时候,下面这样的代码写得莫名其妙的酸爽。没搞懂为什么可以这样连着调用,但是就是爽。

    $(“.classname”).eq(0).attr().css().html();

    然后vue来了,react也来了,,在给前端提供更多操作空间后,同时也增加了很多难度。开始怀念以前函数式调用(不是怀念操作dom,键盘大佬勿喷)。

    例如的弹窗可以直接调用个函数就可以实现,同时可以通过不同的参数来定制不同的效果。

    1. $.model({
    2.   Title:”提示”,
    3.   cancelText:”取消”
    4. })

    在vue的时候自己为了这样使用自己也封装过这样的函数,也写过这样的笔记

    这篇是为了提醒vue可以用函数式调用组件的

    vue插件函数式调用【找回使用jq的回忆】_艾特猫的博客-CSDN博客

    这篇笔记是记录如何使用vue2封装一个函数式调用组件的《像jquery那样快活使用vue

    像jquery那样快活使用vue_艾特猫的博客-CSDN博客_vue像jquery一样调用

    Vue2实现还是相对的不方便,到vue3的时候直接提供了组件teleport来支持渲染内容到特定的标签,可见函数式组件还是非常广泛的使用场景

    那安卓是否可以呢?

    当然,原则上所有程序都可以,只要调用后返回当前对象,后面就可以继续调用该对象的方法。

    下面以dialog使用为例来讲解

    1. AlertDialog.Builder builder = new AlertDialog.Builder(this);        //先得到构造器
    2.         builder.setTitle("提示")
    3. .setMessage("是否确认退出")   //设置内容
    4.         .setIcon(R.mipmap.ic_launcher) //自定义图标
    5.         .setCancelable(false)        //设置是否能点击,对话框的其他区域取消
    6.        .setPositiveButton("确认", new DialogInterface.OnClickListener() {     //设置其确认按钮和监听事件
    7.             @Override
    8.             public void onClick(DialogInterface dialog, int which) {
    9.                 //  which,是哪一个按钮被触发
    10.                 //      其值如下:
    11.                 //   Dialog.BUTTON_NEGATIVE     忽略
    12.                 //   Dialog.BUTTON_POSITIVE     确认
    13.                 //   Dialog.BUTTON_NEUTRAL      取消            
    14.                 dialog.dismiss();
    15.             }
    16.         })
    17.        .setNegativeButton("取消", new DialogInterface.OnClickListener() {     //设置其取消按钮和监听事件
    18.             @Override
    19.             public void onClick(DialogInterface dialog, int which) {
    20.                 dialog.dismiss();
    21.             }
    22.         })
    23.        setNegativeButton("忽略", new DialogInterface.OnClickListener() {     //设置其忽略按钮和监听事件
    24.             @Override
    25.             public void onClick(DialogInterface dialog, int which) {
    26.                 dialog.dismiss();     
    27.             }
    28.         });
    29.         builder.create();       //创建对话框
    30.         builder.show();         //显示对话框
    31.     }

    存在疑点

    代码AlertDialog.Builder builder = new AlertDialog.Builder(this);   为什么返回的是AlertDialog.Builder而不是AlertDialog?

    这和这个组件的代码设计有关系

            AlertDialog类内部存在个类Builder,它提供AlertDialog自定义的所有操作方法,包括自定义属性、自定义点击回调、以及创建和显示

            AlertDialog类内部还存在个类AlertParams来存放这些自定义参数,例如builder.setTitle("提示”)就是修改AlertParams的标题属性

    直到调用  builder.create()才开始填充到视图,  builder.show()让整个节点显示出来

    那AlertDialog做什么呢?

            提供构造函数,给new AlertDialog.Builder(this)的时候调用,它本身的功能并不多,更多的意义可能是提供一个封闭局部环境

    setMessage和setMessage都可以连着调用,为什么create和show没有?

            因为他们返回的是AlertDialog,而不是申明builder时候的AlertDialog.Builder  所以不能链式调用,否则就有类型错误

    我们也可以按照这种方式去构造代码,下面是一个自定义的标题导航条(由于是私有库,所以非本人查看,不公开)

    https://gitee.com/w3cplus/intermediate-android/tree/master/baselibrary/src/main/java/com/hc/baselibray/navigationBar

    支持以下两种初始化的方式

    new DefaultNavigationBar.Builder(this)

    new DefaultNavigationBar.Builder(this,R.id.wrapid)

    如果不传递第二个参数,默认把布局塞到acitivty 布局的第一个字节点的位置,涉及的api有

    根据传参的context获取activity存放布局的标签节点

    1. Activity activity=(Activity) context;
    2. this.mParent=activity.findViewById(android.R.id.content);

    在特定标签节点插入标题导航条

    1. navigationView= LayoutInflater.from(mParams.mContext).inflate(bindLayoutId(),mParams.mParent,false);
    2. //2.添加,到第0个位置
    3.       mParams.mParent.addView(navigationView,0);

    布局文件注意

    1. <TextView
    2.     android:layout_width="wrap_content"
    3.     android:layout_height="wrap_content"
    4.      android:maxLines="1"
    5.       android:id="@+id/title"
    6.       android:layout_gravity="center"
    7.     android:visibility="gone"
    8.     />

    预留多个visiblility属性为gone的标签,根据传递的参数进行切换可视和绑定点击事件

    使用方式

    1. DefaultNavigationBar defaultNavigationBar=new DefaultNavigationBar.Builder(this)
    2. .setTitle("标题")
    3. .setRightTitle("右边")
    4. .setRightOnclickLister(new View.OnClickListener() {
    5. @Override
    6. public void onClick(View view) {
    7. Toast.makeText(context,"点击右侧文字",Toast.LENGTH_LONG).show();
    8. }
    9. })
    10. .builder();

    如果封装的组件较为复杂,可以抽离公共方法和构造函数到特定的抽象类,让不同的实现类实现它

    受限于个人水平,以上内容不保证完全正确,请自行辩证。。有错误地方请评论区指正,谢谢。

  • 相关阅读:
    MyBatis-Plus生成sql语句时怎么知道表名和表的字段名,表的主键名的
    R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究
    AntDesignVue之a-table中key不唯一问题处理的多种方式
    安卓逆向 | 某H新闻类APP Secret
    【Web前端大作业实例网页代码】html+css新闻资讯网页带dw模板和登陆注册(9页)...
    第6章:表单中的受控组件与非受控组件
    2023-11-18 mysql-sysbench压测TPS/QPS-记录
    视频爆炸时代,谁在支撑视频生态网高速运行?
    阿里技术官首发的Java核心框架指导手册,为了大厂得码住学起来~
    vuex在小程序中的方法
  • 原文地址:https://blog.csdn.net/u014071104/article/details/127742076