我正在构建一个简单的二进制十进制转换器,我希望在用户输入时将二进制字符串格式化为4位组。
观察其他类似的问题让我操纵了可编辑的方法“afterTextChanged”但是当我运行应用程序并输入4°数字时,应用程序冻结,RAM监视器开始变得疯狂。
另外,我的edittext“binary”设置为“numberDecimal”。我尝试使用我发现Here的东西暂时改变它,但我似乎无法让它发挥作用。
这是代码: (二进制是我的EditText)
binary.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if(binary.isFocused()){
temp = binary.getText().toString().replaceAll("\\s+","");
if(temp.length()%4==0){
InputFilter[] filters = editable.getFilters(); // save filters
editable.setFilters(new InputFilter[] {}); // clear filters
editable.insert(editable.length()-1," "); // edit text
editable.setFilters(filters);
}
提前谢谢你:D
答案 0 :(得分:1)
我想通了:添加空间以某种方式触发了无限循环。我设法解决了在添加空间之前移除焦点并在此之后重新添加焦点。我也对if条件进行了一些更改,所以现在我可以轻松地删除我的二进制数而不会使光标卡住。
@Override
public void afterTextChanged(Editable editable) {
if(binary.isFocused()){
if(((temp.length()%4 == 0 && temp.length()!=0) && tempSpace.length()<temp.length()) || (tempSpace.isEmpty() && temp.length()%4 == 0)){
InputFilter[] filters = editable.getFilters(); // save filters
editable.setFilters(new InputFilter[] {});
binary.clearFocus(); // clear filters
editable.insert(editable.length()," ");
binary.requestFocus();
// edit text
editable.setFilters(filters);
}
tempSpace= temp;
其中tempSpace是一个临时变量,用于在用户按下按钮之前比较edittext的长度。
谢谢您的回答:D
答案 1 :(得分:0)
您应该实现TranformationMethod
。使用TextWatcher
时,您会遇到afterTextChanged()
触发其他更改的任何更改的问题,因此如果您不小心如何检测到它何时适用,您可能会无限循环回应变化。
答案 2 :(得分:0)
此代码将字符串分开,并在自动添加空格之前将其分组为4个字符。
EditText ed;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed = (EditText)findViewById(R.id.editText);
ed.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)
{
if (count == 4)
{
ed.setText(ed.getText()+" ");
ed.setSelection(ed.getText().length());
}
}
@Override
public void afterTextChanged(Editable s) {}
});
我希望它有所帮助