Java setOnKeyListener的工作原理
我们的家庭作业是制作权重转换器,输入数字时字段会被更新(无需单击“计算”或任何东西)。其中一名学生提供了下面的代码。 代码起作用:当在字段1中输入一个数字时,字段2在键入时会发生变化 我不明白的是这是怎么回事? 在Java setOnKeyListener的工作原理,java,android,keylistener,Java,Android,Keylistener,我们的家庭作业是制作权重转换器,输入数字时字段会被更新(无需单击“计算”或任何东西)。其中一名学生提供了下面的代码。 代码起作用:当在字段1中输入一个数字时,字段2在键入时会发生变化 我不明白的是这是怎么回事? 在onKey方法中,Viewint和keyEvent 那么,侦听器如何“知道”要在哪个视图上进行侦听、要侦听哪些键或要激活哪些事件呢 public class Screen extends Activity { double weight = 2.20462; EditText kgEd
onKey
方法中,View
int
和keyEvent
那么,侦听器如何“知道”要在哪个视图上进行侦听、要侦听哪些键或要激活哪些事件呢
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;
}
});
}
}您必须像这样使用addTextChangedListener-
EditText editText = (EditText) findViewById(R.id.editText1);
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) {
//do here your calculation
String data = s.toString();
}
});
我将只关注其中一个文本字段来回答这个问题。请看第一行:
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
执行以下操作(从):“在该视图中按下硬件键时,注册要调用的回调。”
这意味着,您现在已经告诉视图,当此EditText具有焦点时,用户每次按下一个键时,您都希望得到通知。您对Android API进行此调用,并且在后台,Android会处理您请求的所有内容。它将使用视图
、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转换为lbs,然后更新lbsEdit
查看关于和一般的官方文档。嗯,他为这两个编辑文本创建了一个新的侦听器,这样他就不必担心哪一个编辑文本会发生事件,因为此特定编辑文本的代码已在实际侦听器中。