您的位置:首页 > 其它

EditText的输入联动及其他一些用 4000 法总结

2017-11-26 09:52 453 查看

1.给EditText设置输入联动

之前做过这么一个需求:

一个布局里有多行表格,可供用户导入数据,导入的数据是同一条的话要对这些行里的Edittext设置输入联动,打个比方:

电影名称上映时间导演
1.年度票房最高…..
2.年度评分最高…..
3.年度最佳动作片…..
需求可概括为两点:

1、假如第一行与第二行为同一电影,那么输入1的上映时间2也随之变化;输入2同理;

2、用户更改导入,第一行与第三行为同一电影,那么修改1的内容3会随之变化,2不再变化;

代码:

/**
*
* @param beforeDot  整数位数控制
* @param afterDot   小数位数控制
* @param position   每一行第几个字段
* @param type       特定表格需求,可无视
* @param editText    edittext对象
*/
private void editTextContentFilter(int beforeDot,int afterDot,String position,int type,EditText editText){
final MyTextWatcher watcher = new MyTextWatcher(beforeDot, afterDot, position, type);
editText.addTextChangedListener(watcher);
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
watcher.enable=true;
}else {
watcher.enable=false;
}
}
});
}
class MyTextWatcher implements TextWatcher{
private int beforeDot;
private int afterDot;
private String position;
private int type;
public boolean enable;
private ContentValues upValues;

public MyTextWatcher(int beforeDot,int afterDot,String position,int type) {
this.beforeDot = beforeDot;
this.afterDot = afterDot;
this.position = position;
this.type = type;
upValues = new ContentValues();
}

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

}

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

}

@Override
public void afterTextChanged(Editable s) {
if (enable) {
//位数限制
DiaoChaBiaoUtil.judge(s, beforeDot, afterDot);
//2.可做一些其他需求控制

//3.输入联动
//这里因表格内容特定,使用的是position和type来获取到具体的一个edittext对象,需自己定制
String key =  findEtByPosition(position, TYPE_NUM).getText().toString();
if (relevanceMaps.containsKey(key)) {
List<String> list = relevanceMaps.get(key);
if (list!=null) {
for (String poString : list) {
if (!poString.equals(position)) {
findEtByPosition(poString, type).setText(s.toString());
}
}
}
}
}


关键:

给edittext设置setOnFocusChangeListener监听,通过焦点判断是否为用户主动输入,不然联动的edittext会在afterTextChanged里卡死;

2、控制位数方法:

/**
* 在控件已经设置内容监听的情况下,对数字位数控制
* @param editable
* @param beforeDot  小数点前位数
* @param afterDot   小数点后位数
*/
public static void judge(Editable editable,int beforeDot,int afterDot) {
String temp = editable.toString();
int posDot = temp.indexOf(".");
//直接输入小数点的情况
if (posDot == 0) {
editable.insert(0, "0");
return;
}
//连续输入0
if (temp.equals("00")) {
editable.delete(1, 2);
return;
}
//输入"08" 等类似情况
if (temp.startsWith("0") && temp.length() > 1 && (posDot == -1 || posDot > 1)) {
editable.delete(0, 1);
return;
}

//不包含小数点 不限制小数点前位数
if (posDot < 0 && beforeDot == -1) {
//do nothing 仅仅为了理解逻辑而已
return;
} else if (posDot < 0 && beforeDot != -1) {
//不包含小数点 限制小数点前位数
if (temp.length() <= beforeDot) {
//do nothing 仅仅为了理解逻辑而已
} else {
editable.delete(beforeDot, beforeDot + 1);
}
return;
}

//如果包含小数点 限制小数点后位数
if (temp.length() - posDot - 1 > afterDot && afterDot != -1) {
editable.delete(posDot + afterDot + 1, posDot + afterDot + 2);//删除小数点后多余位数
}
}


3、根据输入内容动态设置字体大小:

float textWidth=0;
//middleWidth默认宽
et_value.setWidth(middleWidth);
Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
@Override
public void afterTextChanged(Editable s) {
//树种组成动态设置字体
mTextPaint.setTextSize(et_value.getTextSize());
textWidth=mTextPaint.measureText(s.toString());
int paddingLeft = et_value.getPaddingLeft();
int paddingRight = et_value.getPaddingRight();
while (textWidth>middleWidth-paddingLeft-paddingRight) {
et_value.setTextSize(TypedValue.COMPLEX_UNIT_PX,et_value.getTextSize()-1);
mTextPaint.setTextSize(et_value.getTextSize());
textWidth=mTextPaint.measureText(s.toString());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Edittext 布局