scrollview+edittext实现批量输入效果

在(android listview ExpandableListView实现多选,单选,全选,edittext实现批量输入,http://blog.csdn.net/wangwo1991/article/details/52084287)这篇博客中写到了edittext的批量输入的实现,这篇博客里面是采用listview+edittext的方式实现的,比较容易实现,但是在处理edittext的焦点错位和数据复用上面很蛋疼,效果不是很好,最终在项目中采用了scrollview+edittext的方式实现了该效果;

scrollview+edittext方式实现的效果:
这里写图片描述
比listview+edittext实现的效果要理想,并没有出现edittext的焦点错位和数据复用,细看效果,需要根据数据去动态的创建一个RelativeLayout,一个LinearLayout(里面包含一个TextView,三个EditText),及一个view(分割线),并根据对应的关系添加到布局中;

1、动态创建布局

    /**
     * 创建新的布局并添加到goalLayout布局中
     */
    private void createEdit() {
        int size = list.size();
        //遍历数据,根据数据的多少动态创建布局
        for (int i = 0; i < size; i++) {
            DataInfo info = list.get(i);
            //创建一个RelativeLayout
            RelativeLayout rl = new RelativeLayout(MainActivity.this);
            //设置背景色
            rl.setBackgroundColor(getResources().getColor(R.color.white));

            //创建LinearLayout
            LinearLayout ll = new LinearLayout(MainActivity.this);
            //设置LinearLayout的方向
            ll.setOrientation(LinearLayout.HORIZONTAL);// 横向

            //动态创建TextView
            TextView tv = new TextView(MainActivity.this);
            //设置TextView居中显示
            tv.setGravity(Gravity.CENTER);
            //设置TextView的大小
            tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, sp2px(this, 13f));
            tv.setTextColor(getResources().getColor(R.color.black));
            tv.setText("" + info.valueFirst);
            //设置TextView的宽高LinearLayout中
            tv.setLayoutParams(new LinearLayout.LayoutParams(sp2px(this, 70), LinearLayout.LayoutParams.WRAP_CONTENT));
            //将创建的TextView添加到
            ll.addView(tv);
            //创建第一个edittext
            createEt(ll, info.valueSecond, 1, info);
            //创建第二个edittext
            createEt(ll, info.valueThird, 2, info);
            //创建第三个edittext
            createEt(ll, info.valueFour, 3, info);

            RelativeLayout.LayoutParams llparams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
            llparams.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
            ll.setLayoutParams(llparams);
            //将ll添加到RelativeLayout布局中
            rl.addView(ll);

            // 动态添加底部线条
            View v = new View(MainActivity.this);
            RelativeLayout.LayoutParams rlparams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, sp2px(this, 0.5f));
            rlparams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
            v.setBackgroundColor(getResources().getColor(R.color.list_item_line_color));
            v.setLayoutParams(rlparams);
            rl.addView(v);

            //设置整个条目的宽高
            rl.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, sp2px(this, 40f)));
            //将rl添加到goalLayout中
            goalLayout.addView(rl);
        }
    }

2、动态创建edittext

    /**
     * 动态创建editext
     * @param ll  将editext添加到的布局
     * @param num  给editext设置的值
     * @param type 用于标识操作对应的editext
     * @param info 数据模型对象
     */
    private void createEt(LinearLayout ll, String num, final int type, final DataInfo info) {
        //动态创建EditText
        final EditText et1 = new EditText(MainActivity.this);
        //设置EditText的字体大小
        et1.setTextSize(TypedValue.COMPLEX_UNIT_PX, sp2px(this, 13f));
        //设置EditText inputtype类型
        et1.setInputType(InputType.TYPE_CLASS_NUMBER);
        // 设置可输入长度
        et1.setFilters(new InputFilter[]{new InputFilter.LengthFilter(5)});
        et1.setTextColor(getResources().getColor(R.color.black));
        //设置padding
        et1.setPadding(sp2px(this, 8f), 0, 0, 0);
        et1.setGravity(Gravity.CENTER_VERTICAL);
        //设置背景
        et1.setBackgroundResource(R.drawable.bg_edittext_normal);
        et1.setText(num);
        //监听输入
        et1.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(etW, sp2px(this, 30));
        llp.leftMargin = dip2px(this, 10);
        llp.rightMargin = dip2px(this, 10);
        et1.setLayoutParams(llp);
        //将创建的EditText添加到LinearLayout布局中
        ll.addView(et1);
    }

在动态创建edittext的时候需要根据屏幕的分比率计算每个edittext的宽度;

2.1、计算每个edittext的宽度

//获取屏幕的宽度
w = getW(MainActivity.this);
//计算每个Edittext的宽度
etW = (w - dip2px(this, 130)) / 3;

很简单,这样效果就实现了。

源码地址:
http://download.csdn.net/download/wangwo1991/9929793

关联播客:
android listview ExpandableListView实现多选,单选,全选,edittext实现批量输入
http://blog.csdn.net/wangwo1991/article/details/52084287

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值