java - setOnKeyListener 的工作原理

标签 java android keylistener

我们的作业是制作权重转换器,在输入数字时更新字段(无需单击“计算”或任何其他内容)。其中一名学生提供了以下代码。 代码有效:当在字段 1 中输入数字时,字段 2 在键入时会发生变化。

我不明白这是如何工作的? 在 onKey 方法中,没有给 View intkeyEvent 赋值 那么监听器如何“知道”哪个 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) {
        // ...
    }
}

上面的作用如下。引用我们在第一行中检索到的公斤的 EditTextsetOnKeyListener 方法执行以下操作(来自 here ):“注册一个回调,当在此 View 中按下硬件按键时调用。”

这意味着您现在已经告诉 View 您希望在该 EditText 获得焦点时每次用户按下某个键时收到通知。您对 Android API 进行调用,Android 将在后台处理您请求的所有内容。它将使用 View viewint keyCodeKeyEvent 事件 调用该方法。您给它一个方法来处理这些输入。因此,您不需要在代码中的任何地方调用该方法,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/

相关文章:

java - 在 Java 中,要使用 "super"关键字,是否必须导入目标类?

java - 继承技术如何运作?

android - 如何在 Android Studio 中对齐 XML 代码?

java - 编译器无法识别我的 .getPoint 输入

java - 如何单击行并使用托管 bean 传递变量

java - JPanel 和 Java 布局管理器

android - 使用自定义操作栏布局时出现 Robolectric InflateException

android - 在 onClick 上启动服务

java - 如何在 JFrame 窗口中获得可关闭的全屏?

java - 突破游戏多键处理