【问题标题】:Android: why is my OnKeyListener() not called?Android:为什么我的 OnKeyListener() 没有被调用?
【发布时间】:2011-04-11 10:57:09
【问题描述】:

我定义了一个 EditText 字段,我希望在用户编辑该字段时收到通知。 所以我想:简单 - 我添加了一个 OnKeyListener ,所以我做到了。但即使文本字段被编辑(甚至显示输入/修改的文本)我也没有得到任何回调,即日志输出没有显示。

    TextView text = new TextView(this);
    text.setText(...);
    ...
    text.setOnKeyListener(new OnKeyListener()
    {                           
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            TextView tv = (TextView)v;
            CharSequence val = tv.getText();
            Log.v(TAG, "value: " + val);
            // ... rest omitted for brevity
        }
    });

知道吗,为什么从不调用回调?

迈克尔

PS.:叹息! Android 真的充满了古怪之处!似乎到目前为止,我接触的几乎所有东西都没有像人们预期的那样立即起作用。而且 - 信不信由你 - 我在 GUI 方面有很多经验,尤其是。在 Java 中(AWT、Swing、SWT,应有尽有......)但 Android 是一个非常强悍的野兽!

【问题讨论】:

  • @Falmarri,这有什么问题?从概念上讲,getText 返回一个字符序列,因此将返回值存储在该类型的变量中并没有错。而且您必须进行强制转换才能使用 getText 方法。您不能只将 onKey 方法更改为采用 TextView,因为它会覆盖 OnKeyListener 中的方法。 (可以说,上面应该有一个@Override,但在这种情况下很明显。)
  • @Falmari:你显然没有为 Android 编程。我也更喜欢字符串,但 Android 唉,到处都返回 CharSequence 而不是字符串,所以你必须经常进行强制转换或 toString()。如果一个方法头只定义了一个“视图”但你知道它是一个 TextView 并且你需要一个只有 TextView 提供的方法,那么你还能做什么呢?有更好的建议吗?

标签: android


【解决方案1】:

我遇到了完全相同的问题,但我只在我的一个 Android 应用上遇到了问题,我从来没有弄清楚有什么区别。

我的解决方案是按照 Mayra 的建议并添加一个 TextWatcher 来处理 TextChanged 事件。因此,无论文本输入如何发生,它都能正常工作。

editName.addTextChangedListener(new TextWatcher () {
        public void afterTextChanged(Editable s) {
            Button btnSave = (Button)findViewById(R.id.btnSaveToon);
            if(s.length() > 0)
                btnSave.setEnabled(true);
            else
                btnSave.setEnabled(false);
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // TODO Auto-generated method stub
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub
        }

    });

在模拟器和我的 HTC Inspire 上像魅力一样工作

【讨论】:

    【解决方案2】:

    您是否使用软键盘 (ime) 输入编辑文本?我相信 onKeyListener 只会被硬件键盘的事件调用。如果可以的话,你最好使用 TextWatcher。 onKeyListener not working with soft keyboard (Android)

    【讨论】:

    • 我通读了引用的附录,这确实可能是问题所在。当然,我从未尝试过使用真正的键盘(因为我的设备没有...),而且模拟器的键盘显然也没有触发此类事件。我按照建议更改为 TextWatcher,这可以解决问题!谢谢!
    【解决方案3】:

    您说您正在处理一个 EditText,但您的代码引用了一个 TextView。我的猜测是您的布局 XML 文件中有一个 EditText,但您在代码中指的是这个新创建的 TextView,实际上它甚至根本不在应用程序的 UI 中。

    如果您的布局 XML 文件中已经有一个 EditText,那么您需要在 Java 代码中获取指向它的指针,可能使用 findViewById() 方法。然后将您的 OnKeyListener 添加到该 EditText。

    在 XML 中定义布局实际上比一次定义一个组件然后将这些组件添加到 UI 中(就像在 Swing 中所做的那样)更有意义(至少在许多情况下,如果不是大多数情况下)。但毫无疑问,这需要一些时间来适应。

    【讨论】:

    • 你是对的 - TextView 实际上是一个 EditText 并且不是由“new”创建的,而是使用充气机创建的。为了简洁起见,我在这里更改了它。但我仍然没有得到任何 onKey()-callbacks...
    • 我可能是错的,但我认为您不想在这里使用充气机。只需执行setContentView,它就会为您充气。我的猜测是,同一个 XML 会膨胀两次——一次通过setContentView,一次通过LayoutInflater。所以你有两个相同布局的副本,并且监听器被添加到错误的一个。
    • 不,问题不在于有两个副本。我什至在开始添加自己的孩子之前明确删除了所有孩子。问题似乎是以下效果 - 请参阅 Mayra 的附录。
    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2022-10-15
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多