首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setOnKeyListener的工作原理

setOnKeyListener的工作原理
EN

Stack Overflow用户
提问于 2016-10-20 21:12:04
回答 2查看 7.2K关注 0票数 1

我们有家庭作业来制作权重转换器,其中字段在键入数字时被更新(不需要单击“计算”或其他任何东西)。其中一个学生提供了下面的代码。这段代码是有效的:当在字段1中输入一个数字时,字段2会在键入时发生变化。

我不明白的是这是怎么工作的?在onKey方法中,没有为View intkeyEvent赋值,那么侦听器如何“知道”要侦听哪个视图、侦听什么键或要激活什么事件呢?

代码语言:javascript
复制
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;
        }
    });
}

}

EN

回答 2

Stack Overflow用户

发布于 2016-10-20 21:50:25

我将只关注其中一个文本字段来回答这个问题。看看这第一行:

kgEdit = (EditText) findViewById(R.id.kgEdit);

所有这些操作都是为了获得对输入kg的EditText的引用。现在有了一个引用,我们可以在该对象上调用方法了。

下一步,我们有这个:

代码语言:javascript
复制
kgEdit.setOnKeyListener(new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // ...
    }
}

以上代码的作用如下所示。参考我们在第一行中检索到的千克的EditText。方法setOnKeyListener执行以下操作(来自here:“注册当在此视图中按下硬件键时调用的回调。”

这意味着,您现在已经告诉视图,您希望在此EditText获得焦点时,每次用户按下某个键时都能得到通知。您调用Android API,Android将在后台处理您所请求的一切。它将使用View viewint keyCodeKeyEvent event调用该方法。你给它一个方法,然后处理这些输入。所以在你的代码中,你不需要调用这个方法,Android在后台调用它,你永远不需要看到或担心它。

现在,由于您在kgEdit上调用了该方法,这意味着只有在聚焦kgEdit并键入键时才会调用以下代码,因此不会与其他EditText混淆。它稍后会调用自己的方法,就在下面。下面是setOnKeyListener中的其余代码

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2016-10-20 21:18:17

你必须像这样使用addTextChangedListener -

代码语言:javascript
复制
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();
        }
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40155466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档