界面无小事(七):使用代码动态增删布局

简介: 界面无小事(一):RecyclerView+CardView了解一下界面无小事(二):让RecyclerView展示更多不同视图界面无小事(三):用RecyclerView + Toolbar做个文件选择器界面无小事(四):来写个滚动选择器吧!界面无小...

界面无小事(一):RecyclerView+CardView了解一下
界面无小事(二):让RecyclerView展示更多不同视图
界面无小事(三):用RecyclerView + Toolbar做个文件选择器
界面无小事(四):来写个滚动选择器吧!
界面无小事(五):自定义TextView
界面无小事(六):来做个好看得侧拉菜单!
github传送门


目录

  • 效果图
  • 前言
  • 布局文件
  • 实现
  • 最后

效果图

不多废话, 先上图, 有兴趣再看下去:

效果图

前言

这篇是之前的一篇旧文改的, 也是想将这篇放入自己的界面无小事专题, 所以当成新篇章来写, 绝对不是为了什么日更之类的事情哦(手动滑稽)~.


布局文件

先来看看布局文件, 不是很复杂, 但是涉及到之后java部分的代码, 所以必须都贴出来. 不过你可以看下预览图就好:

布局预览图
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.so.moreview.ui.activity.MainActivity">

    <LinearLayout
        android:id="@+id/ll_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="@dimen/eight_dp">

        <LinearLayout
            android:id="@+id/ll_item"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/darker_gray"
            android:orientation="vertical"
            android:padding="@dimen/eight_dp"
            tools:ignore="UselessParent">

            <EditText
                android:id="@+id/et_item"
                android:layout_width="match_parent"
                android:layout_height="@dimen/forty_dp"
                android:background="@android:color/white"
                android:gravity="center_vertical"
                android:inputType="textMultiLine"
                android:textSize="@dimen/sixteen_sp"
                tools:ignore="LabelFor" />

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/eight_dp">

                <ImageButton
                    android:id="@+id/ib_add"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentEnd="true"
                    android:background="@drawable/add"
                    android:contentDescription=""
                    tools:ignore="ContentDescription" />
            </RelativeLayout>
        </LinearLayout>
    </LinearLayout>
</ScrollView>

实现

LinkedList<ImageButton> mAddList;
mAddList.add(curView, btAdd);
LinkedList<ImageButton> mDelList;
mDelList.add(curView, btDel);

这里我使用LinkedList<ImageButton>实例存储ImageButton, 就是为了让增删的时候方便一些. 最关键的是增删按钮的代码:

  • 添加条目
/**
 * @param v 添加一个新条目
 */
private void addItem(View v) {
    if (v == null) {
        return;
    }

    // 1. 根据传入的v, 判断是mListAddBtn中的哪一个
    int curView = -1;
    for (int i = 0; i < mAddList.size(); i++) {
        if (mAddList.get(i) == v) {
            curView = i;
            break;
        }
    }

    // 2. 根据获取的值添加控件
    if (curView >= 0) {
        curView++;

        // ll_item
        LinearLayout ll = new LinearLayout(MainActivity.this);
        LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);

        llParams.setMargins(0, UIUtil.dp2px(8), 0, 0);

        ll.setLayoutParams(llParams);
        ll.setBackgroundColor(ContextCompat.getColor(this,
                android.R.color.darker_gray));
        ll.setPadding(UIUtil.dp2px(8), UIUtil.dp2px(8),
                UIUtil.dp2px(8), UIUtil.dp2px(8));
        ll.setOrientation(LinearLayout.VERTICAL);

        // et_item
        EditText et = new EditText(MainActivity.this);
        LinearLayout.LayoutParams etParams =
                new LinearLayout.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT, mEtHeight);

        et.setLayoutParams(etParams);

        et.setBackgroundColor(ContextCompat.getColor(this,
                android.R.color.white));
        et.setGravity(Gravity.CENTER_VERTICAL);
        et.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
        et.setTextSize(16);
        et.setId(mEtId);

        ll.addView(et);

        RelativeLayout rl = new RelativeLayout(MainActivity.this);
        RelativeLayout.LayoutParams rlParams =
                new RelativeLayout.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);

        rlParams.setMargins(0, UIUtil.dp2px(8), 0, 0);
        rl.setLayoutParams(rlParams);

        // ib_add
        ImageButton btAdd = new ImageButton(MainActivity.this);
        RelativeLayout.LayoutParams btAddParams = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);

        btAddParams.addRule(RelativeLayout.ALIGN_PARENT_END);

        btAdd.setLayoutParams(btAddParams);
        btAdd.setBackgroundResource(R.drawable.add);
        btAdd.setId(mBtnAddId);
        btAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addItem(v);
            }
        });

        rl.addView(btAdd);
        mAddList.add(curView, btAdd);

        // ib_del
        ImageButton btDel = new ImageButton(MainActivity.this);
        RelativeLayout.LayoutParams btDelParams = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);

        btDelParams.setMargins(0, 0, UIUtil.dp2px(8), 0);
        btDelParams.addRule(RelativeLayout.LEFT_OF, mBtnAddId);

        btDel.setLayoutParams(btDelParams);
        btDel.setBackgroundResource(R.drawable.del);
        btDel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                delItem(v);
            }
        });

        rl.addView(btDel);
        mDelList.add(curView, btDel);

        ll.addView(rl);

        mLlContent.addView(ll, curView);

        mBtnAddId++;
        mEtId++;
    }
}

看起来有些长, 但是对照布局文件来看, 就非常简单了, 就是用java代码把布局文件里写的再写一遍.

  • 删除条目
/**
 * @param v 删除一个新的EditText条目
 */
private void delItem(View v) {
    if (v == null) {
        return;
    }

    int curView = -1;
    for (int i = 0; i < mDelList.size(); i++) {
        if (mDelList.get(i) == v) {
            curView = i;
            break;
        }
    }

    if (curView >= 0) {
        mAddList.remove(curView);
        mDelList.remove(curView);

        mLlContent.removeViewAt(curView);
    }
}

删除就很简单了, 先弄清点击的是哪个按钮, 然后把相关的一股脑删了即可.


最后

其实这样改动视图还是比较过时的, 之后会准备一篇RecyclerView增删条目的文章. 到时候一对比就可以看到效果了. 但是在某些场合用用还是可以的, 比如弹窗中微调布局之类的. 喜欢记得点赞哦, 暗中关注我也是可以的~


目录
相关文章
|
弹性计算 安全 Linux
SSH 无法远程登录问题的处理思路
购买云服务器 ECS(后续简称 ECS)Linux 服务器后,首先面临的就是如何登录和使用的问题。而由于服务器在云端,所以日常运维中通常都会基于 SSH 客户端登录服务器进行相关操作。今天,我们就从登录 ECS 的不同方法和使用场景讲起,捋清 SSH 无法远程登录问题的常见原因与排查思路。
|
Android开发
Android 音乐APP(五)音乐通知栏、后台播放音乐
Android 音乐APP(五)音乐通知栏、后台播放音乐
1721 0
Android 音乐APP(五)音乐通知栏、后台播放音乐
|
存储 容灾 安全
【ESSD技术解读-总篇】 云上企业级存储——打开存储新维度,促进用户核心业务创新
将企业级存储和云的特点进行完美的融合是云上企业级存储的目标,它打开存储更多新的维度,在保障用户业务永续的同时,帮助用户更好的进行业务创新。本文属ESSD技术解读的总篇,总体介绍ESSD 云盘创新融合了云和企业级存储的特性,以服务为中心,为用户提供了更便捷、更智能的存储服务体验。
3363 0
|
城市大脑 人工智能 算法
一网通管 | 互联网+监管
本文介绍了一网通管 | 互联网+监管的方案概述,方案价值及优势以及最佳实践。
一网通管 | 互联网+监管
|
存储 人工智能 边缘计算
独家首发 | 阿里巴巴新基建洞察系列——《5G智能经济应用场景》研究报告正式发布
大家有没有注意到,5G全球商用其实已经超过1年了,中国也超过半年了,但是大家似乎身边并没有感受到5G带来的变化,甚至连5G手机都看不到几款。5G真的会引爆行业应用和机遇吗?新一轮数字基建驱动下,5G行业应用将往什么方向走?《阿里巴巴新基建洞察之5G智能经济应用场景》带你解锁5G时代应用场景。
10143 0
独家首发 | 阿里巴巴新基建洞察系列——《5G智能经济应用场景》研究报告正式发布
|
机器学习/深度学习 存储 小程序
OSS 实践篇-OSS API 鉴权剖析
出现 signature 一般出现客户端自签名调 API 的操作中, signature 的计算稍微复杂点,建议最好用 SDK 来替代计算的过程和多样性。如果业务强需求,先要读懂如果计算 signature。
7363 0
OSS 实践篇-OSS API 鉴权剖析
|
开发框架 数据可视化 定位技术
L7 2.8 2022 新版本首发!
导读L7 是由蚂蚁金服 AntV 数据可视化团队推出的基于 WebGL 的开源大规模地理空间数据可视分析开发框架。L7 专注于空间数据的可视化表达。图形符号学为理论基础,将抽象复杂的空间数据转化成 2D、3D 符号,通过颜色、大小、体积、纹理等视觉变量实现丰富的可视化表达。欢迎关注和 star 我们的 GitHub:https://github.com/antvis/L7官网:https://l7
L7 2.8 2022 新版本首发!
|
敏捷开发 运维 架构师
超详细的程序员未来职业发展路线
超详细的程序员未来职业发展路线
1793 0
|
传感器 机器人
|
Ubuntu 网络安全 虚拟化
VMware下Ubuntu Server 14.04安装教程(最详细)
一、准备工作 1-1.下载镜像iso文件 http://releases.ubuntu.com/14.04/ubuntu-14.04.5-server-amd64.iso.torrent 1-2.下载安装VMware 二、VMware的选择 2-1.以管理员身份打开VMware Workstation,点击创建虚拟机。
3061 0

热门文章

最新文章