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;
很简单,这样效果就实现了。