本文共 3065 字,大约阅读时间需要 10 分钟。
唉,标题写得好累,这么长还不一定能表达清楚。实在没办法,这个自定义布局定制化比较高,特征比较多,因为前阵子做邮箱的APP,参照QQ邮箱时看到这样的布局觉得很酷,也想实现一下。先贴上效果图直观点:
应该很明了了,流式布局,前面可以加个标题(也支持去掉),最后面默认带个输入框(也可以设置不带),布局主要内容是各个标签,单击选中,会自动弹出软键盘,按删除键就把选中的标签删掉;也支持通过软键盘的删除键自动选中最后一个标签,再按删除键就把该标签删除;支持输入框输入以新增标签,当输入内容并加上逗号,会自动识别并把逗号前面的内容作为新增的标签加入到布局当中。可以看到,发邮件选收件人时这个布局还是很好用的。右侧的加号按钮可以批量新增标签,在写邮件时就可以点击跳转到通讯录列表界面选择多个收件人了,再把数据带回这个布局当中作为新增的标签。
该布局是参照张鸿洋的相关博客写成的,核心是流式布局和标签的单选,巧妙的地方是给每个流式布局的子控件加上一层FrameLayout便于统一处理,标题、输入框和选中删除是我新增的。具体实现就不多说了,张鸿洋的博客写得非常清楚,有兴趣的请看这两篇、。
这里直接看怎么用这个布局吧:
添加仓库:在项目根目录的build.gradle加上jitpack仓库:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
添加依赖:在项目的build.gradle当中添加依赖:
dependencies {
implementation 'com.github.qugengting:flowlayout-singlechoose-library:1.0.0'
}
界面调用:
import android.app.Activity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.Window;import android.widget.ImageButton;import android.widget.TextView;import com.qugengting.view.flowlayout.FlowLayout;import com.qugengting.view.flowlayout.TagAdapter;import com.qugengting.view.flowlayout.TagFlowLayout;public class MainActivity extends Activity { private String[] mVals = new String[]{"a@qq.com", "b@qq.com", "c@126.com", "d@hotmail.com", "e@foxmail.com"}; private LayoutInflater mInflater; private ImageButton mImageButtonAdd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); mInflater = LayoutInflater.from(this); TagFlowLayout flowLayout = findViewById(R.id.id_flowlayout); flowLayout.setAttachLabel(true);//设置是否需要添加标签,默认添加 flowLayout.setAdapter(adapter); mImageButtonAdd = findViewById(R.id.ib_add); mImageButtonAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { adapter.add("addI@sina.com"); adapter.add("addII@sina.com"); adapter.add("addIII@sina.com"); adapter.notifyDataChanged(); } }); } private TagAdapter adapter = new TagAdapter(mVals) { @Override public View getView(FlowLayout parent, int position, String s) { TextView tv = (TextView) mInflater.inflate(R.layout.tv_item, parent, false); tv.setText(s); return tv; } @Override public View getLabelView(FlowLayout parent) { //如果设置flowLayout.setAttachLabel(false);该标签将不显示 TextView tv = (TextView) mInflater.inflate(R.layout.tv_label, parent, false); tv.setText("收件人:"); return tv; } @Override public View getInputView(FlowLayout parent) { return mInflater.inflate(R.layout.edt, parent, false); } }; }
很简单吧,adapter实现三个方法,分别是标签、标题和输入框的布局,然后flowlayout设置setAdapter就可以了,如果不用标题,那么就设置setAttachLabel(false),至于数据的增删,可以操作adapter并adapter.notifyDataChanged()就可以了。
布局文件就不贴了,有需要的也可以去我的github上看看:,不足之处敬请提出。