我已经编写了一些代码来测试用户是否更改了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 }
}
如果我在上面的代码中输入了任何拼写错误,请原谅我。它运行在我的平台上,但我想学习更好的方法来实现这一目标。
答案 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) {
}