4

我正在尝试为用户提供一种从 EditText 将文本输入到 TextView 的方法。但是,如果用户输入了某些内容并想要修复它,我希望他们能够在空的 EditText 上按空格以获取他们写回的最后内容。第一个问题是,如果他们输入“hello”,按 Enter 将其添加到 TextView(从 EditText 中清除它),然后按空格键,EditText 就会出现“hello”。不是我想要的,我不知道为什么。

我将输入的文本放入保存字符串的代码:

b1 = ti.getText().toString();

然后,如果用户按空格键,我相信他们应该在 EditText 中获得 b1。相反,我得到:" " + b1。为什么要在里面增加空间?

if((event.getAction()==KeyEvent.ACTION_DOWN)&&(key == KeyEvent.KEYCODE_SPACE)){

    if(ti.getText().toString().equals("")){
    ti.setText(b1);
}

我的第二个更大的问题是上面的代码只适用于硬件键盘。软件键盘按下空格的键事件是什么?

这一切都在一个 onKeyListener 中。

4

2 回答 2

1

对于您的第一个问题,我怀疑您需要在满足“if”条件时从 onKeyListener 中的 onKey 方法返回 true,以指示事件已被消耗,否则您将获得默认的 onKeyListener 将空间添加到 EditText。IE:

if((event.getAction()==KeyEvent.ACTION_DOWN)&&(key == KeyEvent.KEYCODE_SPACE)){

   if(ti.getText().toString().equals("")){
      ti.setText(b1);
      return true;
   }
}

来自 KeyEvent API 文档的这段摘录应该有助于解决问题 2:“由于软输入方法可以使用多种创造性的文本输入方式,因此不能保证软键盘上的任何按键都会产生按键事件:这是留给IME 的自由裁量权,实际上不鼓励发送此类事件。您永远不应依赖接收 KeyEvents 来获取软输入法上的任何键。特别是,默认的软键盘永远不会向任何针对 Jelly Bean 或更高版本的应用程序发送任何键事件, 并且只会将某些按下删除和返回键的事件发送到面向 Ice Cream Sandwich 或更早版本的应用程序。请注意,其他软件输入法可能永远不会发送按键事件,无论版本如何。如果您需要与软件键盘进行特定交互,请考虑使用诸如 IME_ACTION_DONE 之类的编辑器操作,因为它可以让用户更清楚地了解您的应用程序对按键的反应。”

于 2012-07-02T23:36:31.963 回答
1

解决额外空间问题的一种简单方法是在将其放入 EditText 之前从字符串中删除空间

b1 = b1.substring(1); //<--- cut out the first character, which is the " " in your case.
ti.setText(b1);

ps 我强烈推荐更具描述性的变量名称。如果您使用 ti 和 b1 之类的名称,您的程序可能会令人困惑。也许这些选择在您的程序上下文中更有意义。但是从您在此处显示的内容来看,很难说出这些名称所指的内容。

于 2012-07-03T00:25:34.010 回答