界面无小事(七):使用代码动态增删布局
界面无小事(一):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增删条目的文章. 到时候一对比就可以看到效果了. 但是在某些场合用用还是可以的, 比如弹窗中微调布局之类的. 喜欢记得点赞哦, 暗中关注我也是可以的~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android中的设计模式之构建者模式
参考 《设计模式:可复用面向对象软件的基础 》3.2 Builder 生成器--对象创建型模式 《Android源码设计模式解析与实战》第3章 Builder模式 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 适用性 相同的方法,不同的执行顺序,产生不同的事件结果时。 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适。 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。 结构 Builder模式 Product 表示被构造的复杂对象 包含定义组成部件的类,包括将这些部件装配成最终产品的接口 Builder 抽象Builder类,为创建一个Product对象的各个部件指定抽象接口,规范产品的组建,一般是由子类实现具体的组建过程。 ConcreteBuilder 具体的Builder实现类 Director 使用Builder接口进行构造 协作 客户创建Director对象,并用它所想要的Builder对象进行配置。 一旦产品部件...
-
下一篇
Android进阶之自定义View(2)高仿钉钉运动步数实现可动的进度圆环(下)
接着上篇Android进阶之自定义控件(2)高仿钉钉运动步数实现可动的进度圆环(上)的基础,我们来实现钉钉运动的效果: 《一》View效果分析: 对钉钉运动的效果进行分析: 1、圆弧应该是从135°起,绘制了270°。 2、步数小于10000步时,背景圆弧为灰色,进度圆弧为蓝色渐变色;步数大于10000步时,进度圆弧为渐变的黄色 3、需要绘制中间的步数及步数上面的名次 4、实现步数及进度的动态变化 dingding.gif 有了上篇的基础,实现钉钉运动步数的效果,就很简单了。还是先看一下我最终实现的高仿版效果,给大家点信心。变化的速度可以配置: 高仿钉钉运动效果.gif 《二》实现步骤分解: (1)绘制灰色背景圆弧,135°起,绘制了270° canvas.drawArc(oval, 135, 270, false, mPaint); (2)绘制进度圆弧 canvas.drawArc(oval, 0 + 135, mCurrentStep/ mMaxStep * 270, false, mProgressPaint); (3)绘制文字很简单,只需要以正中间的文字为标准,往上移动一个te...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果