Android模块化 - UI组件篇

背景

当Xml布局被多次拷贝时,不利于模块化开发。对此我们希望屏蔽UI层繁杂逻辑,只关注于业务。

目标

  1. 面向接口,实现UI组件的调用接口模式,并提供完整示例。
  2. 指令式,一行代码一个UI显示,回调式响应。
  3. 参数化,尽可能提供高的扩展性,迎合产品迭代。
  4. 主题化,全局样式,一改全改。

项目

设计

  1. 全局样式定义,参见资源标准/doc/Component-UI-1-Standard
  2. 为扩展,多数组件以inflate形式,使用同<include layout=""/>标签,直接findViewById(...)、setOnClickListener(...)。详见属性-Id参照表。
  3. findViewById(int id)方法为顺序遍历View树,find第一个id并返回;若Xml布局中同一层级包含同类组件G1、G2(内部id相同),对G2中某View C1设置点击事件G2.findViewById(R.id.c1).setOnClickListener(...),如此设置。

效果图

component-ui-title.png
component-ui-ds.gif
component-ui-row.png
component-ui-tab.gif
component-ui-alert.gif
component-ui-sheet.gif
component-ui-status.png
component-ui-button.png

UI组件列表

  1. TitleLayout标题栏使用
  2. DSLayout默认态使用
  3. RowLayout设置行使用
  4. Tab使用
  5. Alert使用
  6. Sheet使用
  7. Popup使用
  8. NoticeLayout使用
  9. BadgeView使用

一、TitleLayout标题栏使用


  • Xml布局中添加

        <com.d.lib.common.view.TitleLayout
            android:id="@+id/tl_title"
            android:layout_width="match_parent"
            android:layout_height="@dimen/lib_pub_dimen_title_height"
            android:background="@color/lib_pub_color_main"
            app:lib_pub_tl_leftDrawable="@drawable/lib_pub_ic_title_back"
            app:lib_pub_tl_middleText="Title" />
    
  • 方法

        1). findViewById(...)
        2). setOnClickListener(...)
        3). setVisibility(int resId, int visibility)
        4). setText(int resId, CharSequence text)
        5). setOnClickListener(int resId, OnClickListener l)
    
  • 对照表(属性-Id)

    Attrs Id
    lib_pub_tl_leftText tv_title_left
    lib_pub_tl_leftDrawable iv_title_left
    lib_pub_tl_leftRes reference
    lib_pub_tl_rightText tv_title_right
    lib_pub_tl_rightDrawable iv_title_right
    lib_pub_tl_rightRes reference
    lib_pub_tl_middleText tv_title_title
    lib_pub_tl_middleDrawable iv_title_middle
    lib_pub_tl_middleRes reference

二、DSLayout默认态使用


  • Xml布局中添加

        <com.d.lib.common.view.DSLayout
            android:id="@+id/dsl_ds"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
  • 设置默认态

      dslDs.setState(DSLayout.STATE_LOADING);
        ------DSLayout.GONE:隐藏默认态
            ------DSLayout.STATE_LOADING:正在加载...
                    ------DSLayout.STATE_EMPTY:暂无数据
                            ------DSLayout.STATE_NET_ERROR:网络错误
    
  • 更改默认内容(可选)

        dslDs.setState(DSLayout.STATE_NET_ERROR)
            .icon(R.drawable.ic_net_failed)
            .desc("暂无网络")
            .button("点击重试",View.VISIBLE);
    
            ------------ 对照表(Func-Desc) -----------
            .gif(...)     |  加载Gif图:本地或网络
            .icon(...)    |  加载Png图: 本地或网络
            .desc(...)    |  状态描述内容
            .button(...)  |  按钮文本内容、按钮是否显示
    
  • 矫正垂直比例(可选,默认垂直居中)

    Attrs Description
    lib_pub_dsl_adjustHeightT 顶部矫正高度
    lib_pub_dsl_adjustHeightB 底部矫正高度
  • 替换默认布局样式(可选)

        1). 拷贝 R.layout.layout_ds 为 R.layout.layout_ds_style_custom,
        2). 仅允许更改属性(大小、相对位置、色值、背景等),禁止更改id、布局结构
        3). app:lib_pub_dsl_layout="@layout/layout_dsl_style_custom"
    

三、RowLayout设置行使用


  • Xml布局中添加

        <com.d.lib.common.view.RowLayout
            android:id="@+id/rl_row"
            android:layout_width="match_parent"
            android:layout_height="@dimen/lib_pub_dimen_row_height"
            android:background="@color/lib_pub_color_bg_main"
            app:lib_pub_rl_gotoVisibility="visible"
            app:lib_pub_rl_icon="@color/lib_pub_color_red"
            app:lib_pub_rl_text="@string/component_ui_dialog_title"
            app:lib_pub_rl_toggleVisibility="gone" />
    
  • 设置文本内容(app:lib_pub_rl_text)

        1). rlRow.setText("content");
    
  • 设置红点文本内容

        rlRow.setNumber("9", View.VISIBLE)
    
  • Toggle按钮(app:lib_pub_rl_toggleVisibility)

        1). setOpen() ------设置开闭
        2). isOpen() ------开闭状态
        3). setOnToggleListener() ------监听toggle开闭状态
    

四、Tab使用


  • SegementView

    • Xml布局中添加

          <com.d.lib.common.view.SegementView
              android:id="@+id/sv_tab"
              android:layout_width="match_parent"
              android:layout_height="27dp"
              android:layout_marginTop="@dimen/lib_pub_dimen_margin"
              app:lib_pub_segementv_borderWidth="1dp"
              app:lib_pub_segementv_colorMain="@color/lib_pub_color_main"
              app:lib_pub_segementv_colorSub="@color/lib_pub_color_white"
              app:lib_pub_segementv_divideWidth="1dp"
              app:lib_pub_segementv_radius="4dp"
              app:lib_pub_segementv_textSize="@dimen/lib_pub_dimen_text_small"
              app:lib_pub_segementv_titles="标签一;标签二;标签三;标签四" />
      
    • 方法

          1). setTitle(String[] title)
          2). select(int index)
          3). setOnSelectedListener(OnSelectedListener listener)
      

  • ScrollTab

    • Xml布局中添加

          <com.d.lib.common.view.tab.ScrollTab
              android:id="@+id/stab_tab"
              android:layout_width="match_parent"
              android:layout_height="40dp"
              android:layout_marginTop="@dimen/lib_pub_dimen_margin"
              android:background="#F9F9F9"
              android:orientation="vertical"
              app:lib_pub_stab_avag="true"
              app:lib_pub_stab_indicatorColor="@color/lib_pub_color_main"
              app:lib_pub_stab_indicatorRadius="0dp"
              app:lib_pub_stab_indicatorType="none"
              app:lib_pub_stab_indicatorWeight="2dp"
              app:lib_pub_stab_indicatorWidth="65dp"
              app:lib_pub_stab_titles="@string/component_ui_labels"
              app:lib_pub_stab_type="view_group" />
      
    • 方法

          1). setTitles(List<String> ts)
          2). setViewPager(ViewPager viewPager)
          3). setNumber(int position, String text, int visibility)
          4). setOnTabListener(OnTabListener l)
      

五、Alert使用


  • Loading...

        AlertDialogFactory.createFactory(activity).getLoadingDialog("Loading...");

  • AlertDialog

        AlertDialogFactory.createFactory(activity).getAlertDialog("Title",
                "Content",
                "Ok", "Cancel",
                new AlertDialogFactory.OnClickListener() {
                    @Override
                    public void onClick(AlertDialog dlg, View v) {

                    }
                }, new AlertDialogFactory.OnClickListener() {
                    @Override
                    public void onClick(AlertDialog dlg, View v) {

                    }
                });

  • AlertSubDialog

        AlertDialogFactory.createFactory(activity).getAlertSubDialog("Title",
                "Content",
                "Sub tips",
                true, new AlertSubDialog.OnCheckListener() {
                    @Override
                    public void onSubmit(Dialog dlg, boolean isChecked) {

                    }

                    @Override
                    public void onCancel(Dialog dlg) {

                    }
                });

  • EditDialog

        AlertDialogFactory.createFactory(activity).getEditDialog("Title",
                "Content",
                new EditDialog.OnEditListener() {
                    @Override
                    public void onSubmit(Dialog dlg, String content) {

                    }

                    @Override
                    public void onCancel(Dialog dlg) {

                    }
                });

  • InfoDialog

        AlertDialogFactory.createFactory(activity).getInfoDialog("Title",
                Arrays.asList(new InfoDialog.Bean("1", "" + 1111111),
                        new InfoDialog.Bean("2", "" + 2222222),
                        new InfoDialog.Bean("3", "" + 3333333),
                        new InfoDialog.Bean("4", "" + 4444444),
                        new InfoDialog.Bean("5", "" + 5555555)));

  • OperationDialog

        AlertDialogFactory.createFactory(activity).getOperationDialog("Content",
                Arrays.asList(new OperationDialog.Bean("普通操作1", R.color.lib_pub_color_main, false),
                        new OperationDialog.Bean("普通操作2", R.color.lib_pub_color_main, false)),
                new AbsSheetDialog.OnItemClickListener() {
                    @Override
                    public void onClick(Dialog dlg, int position, String item) {

                    }

                    @Override
                    public void onCancel(Dialog dlg) {

                    }
                });

六、Sheet使用


  • BottomVerDialog

        AlertDialogFactory.createFactory(this).getBottomVerDialog("告知当前状态,信息和解决方案单行",
                Arrays.asList(new BottomVerSheetDialog.Bean("普通操作1", R.color.lib_pub_color_text_main, false),
                        new BottomVerSheetDialog.Bean("普通操作2", R.color.lib_pub_color_text_main, false),
                        new BottomVerSheetDialog.Bean("普通操作3", R.color.lib_pub_color_text_main, false),
                        new BottomVerSheetDialog.Bean("危险操作", R.color.lib_pub_color_red, false),
                        new BottomVerSheetDialog.Bean("不可用操作", R.color.lib_pub_color_text_hint, false)),
                new AbsSheetDialog.OnItemClickListener() {
                    @Override
                    public void onClick(Dialog dlg, int position, String item) {

                    }

                    @Override
                    public void onCancel(Dialog dlg) {

                    }
                });

  • BottomHorDialog

        AlertDialogFactory.createFactory(this).getBottomHorDialog("分享",
                Arrays.asList(new BottomHorSheetDialog.Bean("QQ", R.drawable.lib_pub_circle_msg_number),
                        new BottomHorSheetDialog.Bean("微信", R.drawable.lib_pub_circle_msg_number),
                        new BottomHorSheetDialog.Bean("朋友圈", R.drawable.lib_pub_circle_msg_number),
                        new BottomHorSheetDialog.Bean("微博", R.drawable.lib_pub_circle_msg_number),
                        new BottomHorSheetDialog.Bean("短信", R.drawable.lib_pub_circle_msg_number)),
                new AbsSheetDialog.OnItemClickListener() {
                    @Override
                    public void onClick(Dialog dlg, int position, String item) {

                    }

                    @Override
                    public void onCancel(Dialog dlg) {

                    }
                });

  • BottomShareDialog

            AlertDialogFactory.createFactory(this).getBottomShareDialog("文件名",
                    Arrays.asList(new BottomShareSheetDialog.Bean("链接地址: ", "https://www.baidu.com/link?url=eZH1yw2u1h-CNrpm7Q3jD_EfVnUxwUuBHlTGhLlA_KfhwtG0TGSl4a7kPsJNMqE8&wd=&eqid=f50ccdfc00009400000000065b232f14"),
                            new BottomShareSheetDialog.Bean("提取密码: ", "3854", false)));
    

七、Popup使用


  • MenuPopup

            PopupWindowFactory.createFactory(this)
                    .getMenuPopup(Arrays.asList(new MenuPopup.Bean("添加", R.color.lib_pub_color_text_hint, false),
                            new MenuPopup.Bean("删除", R.color.lib_pub_color_main, false)), new MenuPopup.OnMenuListener() {
                        @Override
                        public void onClick(PopupWindow popup, int position, String item) {
    
                        }
                    }).showAsDropDown(ivMenu);
    

八、NoticeLayout使用


  • Xml布局中添加

        <com.d.lib.common.view.NoticeLayout
            android:id="@+id/notice_tips"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginLeft="@dimen/lib_pub_dimen_margin"
            android:layout_marginRight="@dimen/lib_pub_dimen_margin"
            app:lib_pub_noticel_exitVisibility="gone"
            app:lib_pub_noticel_gotoVisibility="visible"
            app:lib_pub_noticel_text="@string/component_ui_notice_type1" />
    
  • 方法

        1). findViewById(...)
        2). setOnClickListener(...)
        3). setVisibility(int resId, int visibility)
        4). setText(int resId, CharSequence text)
        5). setOnClickListener(int resId, OnClickListener l)
    

九、BadgeView使用


  • Xml布局中添加

        <com.d.lib.common.view.BadgeView
            android:id="@+id/bv_badge"
            android:layout_width="wrap_content"
            android:layout_height="20dp"
            android:gravity="center"
            android:minWidth="20dp"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:textColor="@color/lib_pub_color_white"
            android:textSize="10dp"
            app:lib_pub_badgev_color="@color/lib_pub_color_red" />
    
  • 方法

        1). setText(CharSequence text)
        2). setTextAdj(CharSequence text)
    
  • 对照表(属性-描述)

    Attrs Description
    lib_pub_badgev_color 角标背景色
    lib_pub_badgev_circle 是否限定圆形
    lib_pub_badgev_radius 椭圆圆角弧度
    lib_pub_badgev_max 最大显示限定数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容