2012-06-28 16 views
7

にキーを入力するには聞くことはここに私のコードです:アンドロイド

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のエミュレータを使用しています)、 イベントはアクティブ化されていません

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

答えて

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 true; 

     }   
     return false; 
    } 

EDIT: Davidは正しいです!

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

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

16

返品trueは問題ではありません。

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

を明確にするために編集:リスナーの

戻り値は、イベントが、または呼び出されないであろうことを信号として理解されるものではありません。とにかく、return句はの後にと呼ばれ、Toastが表示されます。

これ以上のアクションが必要(戻り値false)であるか、またはメソッドがイベントを完全かつ適切に処理した(戻り値true)という信号です。

戻り

がTrueリスナーがは、そうでない場合はfalseイベントを消費している場合:documentationはこれらの言葉で述べている理由です。


の違いがあります:あなたのActivityクラスでView.OnKeyListenerinterfaceを実装

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

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

技術的には、Activityはそのイベントを処理する方法を定義していますが、それだけではそのようなイベントを生成することはできません。それを使用して、あなたのActivity実装

Viewのコールバックを設定

  • Viewがリスナーに結合する(ことを起こるあなたのActivity)、イベントが発生するたびにそれを通知することを約束。

    Activityと契約すると(ViewにフォーカスがあるときにEnterキーが押されます)、Activityに通知します。 BOTH当事者は、以前に同意した通りに(前の項目を参照)と契約を実行することができることを事前に宣言しているため、Activityが前に宣言しています。

    メタファーはさておき、再び、技術的には、ここでActivityViewイベントをトリガしたときに、後に通知されるようにViewによって登録されています。 Activityがの場合はと表示されますが、の場合はとなります。の場合。

    結論:

    これは(少なくともこの場合)interface秒間だけメタファーです。それは複雑に見えるかもしれませんが、二者間の合意として考えると、はっきりしています。より良い、技術的な説明が必要な場合は、interfaceについて読むことをお勧めします。


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

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

    そうではありません。 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); 
    }; 
    
+0

ああ、もちろん、それは集中いずれかでなければなりません...それ以外の場合はどのように我々は、非接触モードでとにかく見解を区別します...私はあなたがそれに注意を払っていると確信しています、 右?右? ;-) – davidcesarino

+0

+1の正確な回答 –

+0

こんにちはDavidさんと他のみんな。本当に私は全体のアクティビティにリスナーを設定できませんか? –