我们有家庭作业来制作权重转换器,其中字段在键入数字时被更新(不需要单击“计算”或其他任何东西)。其中一个学生提供了下面的代码。这段代码是有效的:当在字段1中输入一个数字时,字段2会在键入时发生变化。
我不明白的是这是怎么工作的?在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;
}
});
}}
发布于 2016-10-20 21:50:25
我将只关注其中一个文本字段来回答这个问题。看看这第一行:
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:“注册当在此视图中按下硬件键时调用的回调。”
这意味着,您现在已经告诉视图,您希望在此EditText获得焦点时,每次用户按下某个键时都能得到通知。您调用Android API,Android将在后台处理您所请求的一切。它将使用View view、int keyCode和KeyEvent event调用该方法。你给它一个方法,然后处理这些输入。所以在你的代码中,你不需要调用这个方法,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
发布于 2016-10-20 21:18:17
你必须像这样使用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();
}
});https://stackoverflow.com/questions/40155466
复制相似问题