运用Android Studio在开发app的过程中遇到的,想想是个普通问题但是在网上经过查询后虽然清楚了导致问题的原因(下文有描述),但是却没有适合自己的解决方式,以下是本人根据个人需求给出的解决方案。
目标:
输入数字后可以正常修改(设置的EditText只可输入数字、小数点和none)
问题:
测试app在EditText中填入内容并删除会导致:
情况一:退出当前Activity
情况二:程序崩溃
解决方法:
第一步:
//设置editText对象的键位监听事件
editText.setOnkeyListener(new View.OnKeyListener(){
//重写onKey方法监听删除键
@Override
public boolean onKey(View v,int keyCode,KeyEvent event){
//如果你按了删除键
if(keyCode == KeyEvent.KEYCODE_DEL){
//获取当前editText中的内容
String text = editText.getText().toString();
//判断text中是否有内容
if(0<text.length()){
//判断text中是否只有一个字符
if(0 == text.length()-1){
//如果只有一个则直接令editText为"",即none
editText.setText("");
//将焦点置于第0位,即最开始
editText.setSelection(0);
}else{
//否则删除该字段的最后一个字符并将删除后的结果赋予newText
String newText = text.substring(0,text.length()-1);
//显示newText中的内容
editText.setText(newText);
//设置焦点在该字段最后
editText.setSelection(newText.length());
}
}
return true;
}
return false;
}
});
提示:这里的editText在定义调用时需要加’final’
第二步:
//对editText对象的内容变化进行监听
editText.addTextChangedListener(new TextWatcher() {
@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(s.toString().equals("")){
//如果是则直接让成员变量putNumber为0
TransferActivity.this.putNumber=0;
}else{
//如果不是则将字符串类型转换成Double类型并赋给pubNumber
TransferActivity.this.putNumber=Double.parseDouble(s.toString());
}
}
});
tips:这里提到的’putNumber’是从editText中获取的数字,用于之后的运算与此问题无关
由此就解决了当前的问题。退出Activity是因为按键冲突,需要我们在onKey方法中加上对删除键(KEYCODE_DEL)的判断,而系统崩溃是由于自己的原因,当删除最后一个字符后,执行afterTextChanged方法,之前方法里我是这么写的:
当s为""时怎么可以将其转变成Double类型呢?还是因为自己当时没有考虑到。
最后效果:
不会再出现退出当前Activity的情况~