android流式布局,单选,带edittext,支持软键盘的输入新增和删减删除

        唉,标题写得好累,这么长还不一定能表达清楚。实在没办法,这个自定义布局定制化比较高,特征比较多,因为前阵子做邮箱的APP,参照QQ邮箱时看到这样的布局觉得很酷,也想实现一下。先贴上效果图直观点:

android流式布局,单选,带edittext,支持软键盘的输入新增和删减删除_第1张图片

        应该很明了了,流式布局,前面可以加个标题(也支持去掉),最后面默认带个输入框(也可以设置不带),布局主要内容是各个标签,单击选中,会自动弹出软键盘,按删除键就把选中的标签删掉;也支持通过软键盘的删除键自动选中最后一个标签,再按删除键就把该标签删除;支持输入框输入以新增标签,当输入内容并加上逗号,会自动识别并把逗号前面的内容作为新增的标签加入到布局当中。可以看到,发邮件选收件人时这个布局还是很好用的。右侧的加号按钮可以批量新增标签,在写邮件时就可以点击跳转到通讯录列表界面选择多个收件人了,再把数据带回这个布局当中作为新增的标签。

        该布局是参照张鸿洋的相关博客写成的,核心是流式布局和标签的单选,巧妙的地方是给每个流式布局的子控件加上一层FrameLayout便于统一处理,标题、输入框和选中删除是我新增的。具体实现就不多说了,张鸿洋的博客写得非常清楚,有兴趣的请看这两篇Android 自定义ViewGroup 实战篇 -> 实现FlowLayout、Android TagFlowLayout完全解析 一款针对Tag的布局。

        这里直接看怎么用这个布局吧:

添加仓库:在项目根目录的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[]{"[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"};
    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("[email protected]");
                adapter.add("[email protected]");
                adapter.add("[email protected]");
                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上看看:https://github.com/qugengting/MyFlowLayout,不足之处敬请提出。

 

 

 

你可能感兴趣的:(自定义布局)