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