我们的作业是制作权重转换器,在输入数字时更新字段(无需单击“计算”或任何其他内容)。其中一名学生提供了以下代码。 代码有效:当在字段 1 中输入数字时,字段 2 在键入时会发生变化。
我不明白这是如何工作的?
在 onKey
方法中,没有给 View
int
和 keyEvent
赋值
那么监听器如何“知道”哪个 View 以及要监听哪些键或要激活哪个事件?
public class Screen extends Activity {
double weight = 2.20462;
EditText kgEdit, lbsEdit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
kgEdit = (EditText) findViewById(R.id.kgEdit);
lbsEdit = (EditText) findViewById(R.id.lbsEdit);
kgEdit.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
String kg = kgEdit.getText().toString();
if (kg.isEmpty()) {
lbsEdit.setText("");
} else {
double num = Double.valueOf(kgEdit.getText().toString()) * weight;
lbsEdit.setText(num + "");
}
return false;
}
});
lbsEdit.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
String lbs = lbsEdit.getText().toString();
if (lbs.isEmpty()) {
kgEdit.setText("");
} else {
double num = Double.valueOf(lbsEdit.getText().toString()) / weight;
kgEdit.setText(num + "");
}
return false;
}
});
}
}
最佳答案
我将只关注其中 1 个文本字段来回答这个问题。看第一行:
kgEdit = (EditText) findViewById(R.id.kgEdit);
这一切都是为了获取用于输入 kg 的 EditText
的引用。现在有了引用,我们可以调用该对象的方法。
接下来,我们有这个:
kgEdit.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// ...
}
}
上面的作用如下。引用我们在第一行中检索到的公斤的 EditText
。 setOnKeyListener
方法执行以下操作(来自 here ):“注册一个回调,当在此 View 中按下硬件按键时调用。”
这意味着您现在已经告诉 View 您希望在该 EditText 获得焦点时每次用户按下某个键时收到通知。您对 Android API 进行调用,Android 将在后台处理您请求的所有内容。它将使用 View view
、int keyCode
和 KeyEvent 事件
调用该方法。您给它一个方法来处理这些输入。因此,您不需要在代码中的任何地方调用该方法,Android 在后台调用它,您永远不必看到或担心它。
现在,因为您在 kgEdit
上调用了该方法,这意味着只有当 kgEdit
获得焦点并键入按键时才会调用以下代码,因此不会与另一个EditText
。它稍后会调用自己的方法,就在下面。以下是 setOnKeyListener
内的其余代码:
String kg = kgEdit.getText().toString();
if (kg.isEmpty()) {
lbsEdit.setText("");
} else {
double num = Double.valueOf(kgEdit.getText().toString()) * weight;
lbsEdit.setText(num + "");
}
return false;
它的作用是获取 kgEdit
中的当前文本,该文本已使用用户按下的键进行了更新。它只是检查文本是否为空,如果是,则删除 lbsEdit 中的文本。如果不为空,则获取文本,将其转换为数字,将数字从 kg 转换为 lb 并更新 lbsEdit
关于java - setOnKeyListener 的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40155466/