10

これが私のコードです:

public class CaptureENTER extends Activity implements OnKeyListener{

/* on create and other stuff in here*/

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                (keyCode == KeyEvent.KEYCODE_ENTER)) {
           Toast.makeText(LiVoiceActivity.this,
                                     "YOU CLICKED ENTER KEY",
                                     Toast.LENGTH_LONG).show();

        }       
        return false;
    }

何が起こっているのかわかりませんが、キーボードの ENTER キーを押しても (Android エミュレーターを使用しています)、イベントがアクティブになりません

私は何が欠けていますか?

4

2 に答える 2

19

戻るtrueことは問題ではありません。

Viewリスナーをだけでなくに設定する必要があるため、失敗していますActivity

明確にするために編集:

リスナーの戻り値は、イベントが呼び出されるか呼び出されないかを示す信号として理解されることを意図したものではありません。とにかく、句はyourが表示された後returnにのみ呼び出されるため、それはできませんでした。Toast

これは、さらなるアクションが必要であること (return false)、またはメソッドがイベントを完全かつ適切に処理したこと(return ) をシステムに知らせるシグナルtrueです。そのため、ドキュメントにはこれらの言葉で次のように記載されています。

戻り値

リスナーがイベントを消費した場合は true、それ以外の場合は false。


次の違いがあります。

  • クラスに を実装View.OnKeyListener interfaceします。Activity

Activityこれにより、インターフェイスによって提供される機能をクラスに実装できます。つまり、その種のイベントの処理方法を知っていることを世界に宣言できます。Activity

「宣言する」と言ったことに注意してください。タスクを処理する方法を知っていると宣言したからといって、人々がそのタスクをあなたに与えるわけでも、そのようなタスクを自分で生成できるわけでもありませんimplements私の意見では、これはキーワードの良いメタファーです。ここではActivity「タスクを要求」します。

比喩はさておき、技術的には、Activityはそのイベントを処理する方法を定義していますが、それ自体でその種のイベントを生成することはできません。

  • ViewコールバックをActivity実装に設定する

それを使用して、 aViewはリスナー (たまたまあなたのActivity) にバインドし、イベントが発生するたびに通知することを約束します。

と「契約」して入力を受信し (にフォーカスがActivityあるときにユーザーが ENTER キーを押す)、 に通知します。そして、以前にそれを実行できると宣言したため、両方の当事者が以前に合意したとおりに契約を実行できます (前の項目を参照)。ViewActivityActivity

メタファーはさておき、技術的には、ここでActivityは によって登録され、後でがイベントをトリガーしたViewときに通知されます。View方法Activityを宣言しますが、 はいつかを知っています。View

結論:

これはinterfaces の比喩にすぎません (少なくともこの場合)。複雑に見えるかもしれませんが、二者合意と考えれば一目瞭然です。より良い、技術的な説明が必要な場合は、interfaces について読むことをお勧めします。


新しいコメントの質問への回答:

こんにちは、デビッドと他の皆さん。アクティビティ全体にリスナーを設定することはできませんか?

そうではありません。オーバーライドする必要がありますdispatchKeyEvent。例:

@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
    Toast.makeText(UITestsActivity.this,
               "YOU CLICKED ENTER KEY",
                Toast.LENGTH_LONG).show();
        return true;
    }
    return super.dispatchKeyEvent(e);
};
于 2012-06-28T03:55:27.977 に答える
11

これを試して:

public class CaptureENTER extends Activity implements OnKeyListener{ 

/* on create and other stuff in here*/ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
        if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
                (keyCode == KeyEvent.KEYCODE_ENTER)) { 
           Toast.makeText(LiVoiceActivity.this, 
                                     "YOU CLICKED ENTER KEY", 
                                     Toast.LENGTH_LONG).show(); 
          return true;

        }        
        return false; 
    }

編集: デビッドは正しいです!!

trueを返すことは問題ではありません。

リスナーをアクティビティだけでなくビューに設定する必要があるため、失敗しています。

于 2012-06-28T03:45:05.223 に答える