频道栏目
首页 > 资讯 > 其他 > 正文

scrollview+edittext实现批量输入效果

17-08-15        来源:[db:作者]  
收藏   我要投稿

scrollview+edittext实现批量输入效果,在这篇博客中写到了edittext的批量输入的实现,这篇博客里面是采用listview+edittext的方式实现的,比较容易实现,但是在处理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;

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

相关TAG标签
上一篇:最简单实用微信公众号永久获取accesstoken
下一篇:乌龙的CVE-2017-8570样本及背后的狗血
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站