Java setOnKeyListener的工作原理

Java setOnKeyListener的工作原理,java,android,keylistener,Java,Android,Keylistener,我们的家庭作业是制作权重转换器,输入数字时字段会被更新(无需单击“计算”或任何东西)。其中一名学生提供了下面的代码。 代码起作用:当在字段1中输入一个数字时,字段2在键入时会发生变化 我不明白的是这是怎么回事? 在onKey方法中,Viewint和keyEvent 那么,侦听器如何“知道”要在哪个视图上进行侦听、要侦听哪些键或要激活哪些事件呢 public class Screen extends Activity { double weight = 2.20462; EditText kgEd

我们的家庭作业是制作权重转换器,输入数字时字段会被更新(无需单击“计算”或任何东西)。其中一名学生提供了下面的代码。 代码起作用:当在字段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;
        }
    });
}

}您必须像这样使用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

查看关于和一般的官方文档。嗯,他为这两个编辑文本创建了一个新的侦听器,这样他就不必担心哪一个编辑文本会发生事件,因为此特定编辑文本的代码已在实际侦听器中。