改变对多个edittext框的关注

时间:2011-02-17 19:28:19

标签: android

我已经编写了一些代码来测试用户是否更改了6个edittext框中的任何一个,但代码看起来很笨重。我想知道是否有更优雅的方法来做到这一点。

用户在所有6个edittext框中输入数字,并且在每个条目之后,计算例程会在进行计算之前检查所有框是否都有有效数字。 kistener必须在丢失的污垢上开火,以便在计算完成之前将数字放在盒子中。并输出结果。如果用户想要返回并在6个edittext框中的任何一个中更改值,则计算例程将再次运行。 我在onCreate部分为每个edittext框设置了6个监听器。 然后我有6个单独的例程来测试每个hasFocus == false。

在onCreate部分,我为6个用户输入edottext框中的每一个设置了一个监听器:

et1.setOnFocusChangeListener(this);
.   
.
  .
.
et6.setOnFocusChangeListener(this);

然后我有一个方法来检查是否有任何edittext框失去焦点,建议用户更改一些数据,然后重新运行计算。
我检查了6个用户输入edittext框中的每一个,如下所示:

@Override
public void onFocusChange(View v, boolean hasFocus)
{   if ((v == findViewById(R.id.et1)) && (hasFocus==false))
        {do calculations } 
    .
    .
    .
    .
    if ((v == findViewById(R.id.et6)) && (hasFocus==false))
        {do calculations } 

}

如果我在上面的代码中输入了任何拼写错误,请原谅我。它运行在我的平台上,但我想学习更好的方法来实现这一目标。

2 个答案:

答案 0 :(得分:3)

我认为检查哪个视图失去了焦点是不必要的,除非根据哪个盒子失去焦点而计算不同。如果计算相同,只需尝试:

public void onFocusChange(View v, boolean hasFocus) {
    if(!hasFocus) {
        //do calculations
    }
}

如果你只关心六个中的一个失去焦点,那么只要焦点改变,只需检查它是否没有聚焦,然后执行计算。

另外,仅供参考,检查if(v.getId() == R.id.et1)而不是不必要地调用findViewById()会更有效。

编辑:只是想一想,没有对此进行过测试,但是这样的事情也可能更有效,只有在实际改变了价值时才会发生计算:

private String last;

public void onFocusChange(View v, boolean hasFocus) {
    if(hasFocus) {
        last = ((EditText)v).getText().toString();      
    } else {
        if(!((EditText)v).getText().toString().equals(last)) {
            //do calculations
        }
    }
}

答案 1 :(得分:2)

如果文本实际发生了变化,您可能只想进行更改。因此,您应该为edittexts添加TextChangedListener。因此,对于每个编辑文本:

et1.addTextChangedListener(this);
...
et6.addTextChangedListener(this);

然后,让您的班级实施TextWatcher

@Override
public void afterTextChanged(Editable s) {
    // do calculations
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}