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);
}

2 つ目の大きな問題は、上記のコードがハードウェア キーボードでしか機能しないことです。ソフトウェア キーボードのスペースを押すキー イベントは何ですか?

これはすべて onKeyListener にあります。

4

2 に答える 2

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 に答える
1

最初の問題については、イベントが消費されたことを示すために、「if」条件が満たされたときに onKeyListener の onKey メソッドから true を返す必要があると思われます。すなわち:

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 以降を対象とするアプリケーションにキー イベントを送信しません. , and will only send event for some press of the delete and return keys to applications targetting Ice Cream Sandwich 以前. 他のソフトウェア入力メソッドは、バージョンに関係なくキーイベントを送信しない場合があることに注意してください.ソフトウェア キーボードとの特定の対話が必要な場合は、IME_ACTION_DONE などのエディター アクションを使用することを検討してください。これにより、アプリケーションがキーの押下にどのように反応するかをユーザーがより明確に把握できるようになります。"

于 2012-07-02T23:36:31.963 に答える