2010-11-21 12 views
38

Android携帯の物理メニューボタンが押されたことを検出しようとしています。私は以下のコードは動作するが、そうではない。どこが間違っていますか?Androidの物理メニューキーの検出

返されるエラーは、 'パラメータの無効な修飾子ですonKeyDown;唯一の最終的にはあなたがイベントを処理しなかった場合はAndroidシステムがそれを処理するために残りのコンポーネントにイベントを渡すことができますので、あなたはfalseを返さなかった場合だけ、trueを返す「

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // Do Stuff 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+4

この質問には今すぐ完全に回答がありますので、回答を受け入れることができれば幸いです。 – SK9

答えて

0

を許可されています。

79

私はonKeyUpで、アップキーイベントではなく、ダウンのイベントを見てね。

public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // ........ 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

私たちがイベントを処理しているので、我々はtrueを返します。システムでイベントを処理する場合は、falseを返します。

Activityは、KeyEventの既知の間接サブクラスであるため、Activityインスタンスでもすべて実行できます。

+0

また、docs [KeyEvent.Callback](http://developer.android.com/reference/android/view/KeyEvent.Callback.html)を見てください。ここには[example](http://開発者です。 android.com/training/keyboard-input/commands.html) –

+0

それは決してうまくいかない答えです。以下の答えをご覧ください。 –

+0

魅力のように私のために働いた。最初にonKeyDown()を試したので、私は懐疑的でした。メニューボタンのイベントは、自分のアクティビティに流れ込まず、 "アクション"ツールバーのどこかで消費されました。 – gregko

12

上記のすべてに基づいて、これはメニューキー "up"イベントのみを消費し、他のキーイベントをスーパークラスに渡す正しい実装のようです。

public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // ... 
     return true; 
    } else { 
     return super.onKeyUp(keyCode, event); 
    } 
} 
+0

これはすべてを合計し、trueを返します。それ以外の場合はスーパークラスを呼び出します。 –

6
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    //Checking for the "menu" key 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     if (mDrawerLayout.isDrawerOpen(mDrawerList)) { 
      mDrawerLayout.closeDrawers(); 
     } else { 
      mDrawerLayout.openDrawer(Gravity.RIGHT); 
     } 
     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+3

あなたのコードの説明を与える方が良いです。 – Raptor

+0

私はこの正確なコードを探していた:左手のナビゲーション・ドロワーを隠して見せている。ありがとう。 –

0

あなたはActivityクラス内にonKeyDownメソッドをオーバーライドしていることを確認します。 Viewクラスには別のonKeyDownメソッドがありますが、メニューキーを押すと呼び出されることはありません。

-3

私はこの質問の非常にクールな答えを持っています:) 私は最後の1年間笑を試して、私はちょうど3日前に解決策を見つけました。答えを見てください。 ホームウォッチャーseptateクラスを作成する必要があります。 HomeWatcherの名前で以下のコードを正確に使用してください。

public class HomeWatcher { 
    static final String TAG = "HomeWatcher"; 
    private Context mContext; 
    private IntentFilter mFilter; 
    private OnHomePressedListener mListener; 
    private InnerRecevier mRecevier; 

    public interface OnHomePressedListener { 
     public void onHomePressed(); 

     public void onHomeLongPressed(); 

     //public void onLockLongPressed(); 
    } 

    public HomeWatcher(Context context) { 
     mContext = context; 
     mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
    } 


    public void setOnHomePressedListener(OnHomePressedListener listener) { 
     mListener = listener; 
     mRecevier = new InnerRecevier(); 
    } 

    public void startWatch() { 
     try{ 
     if (mRecevier != null) { 
      mContext.registerReceiver(mRecevier, mFilter); 
     } 
     }catch(Exception e){} 
    } 


    public void stopWatch() { 
     try{ 
     if (mRecevier != null) { 
      mContext.unregisterReceiver(mRecevier); 
     } 
     }catch(Exception e){} 
    } 


    class InnerRecevier extends BroadcastReceiver { 
     final String SYSTEM_DIALOG_REASON_KEY = "reason"; 
     final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; 
     final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 
     final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 
     //final String SYSTEM_DIALOG_REASON_Lock = "lock"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
       String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 

       if (reason != null) { 
        Log.e(TAG, "action:" + action + ",reason:" + reason); 
        if (mListener != null) { 
         if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
          mListener.onHomePressed(); 
         } else if (reason 
           .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
          mListener.onHomeLongPressed(); 

         } 
        /* else if (reason 
           .equals(SYSTEM_DIALOG_REASON_Lock)) { 
          mListener.onLockLongPressed(); 

         }*/ 

        } 
       } 
      } 
     } 
    } 
} 

その後、HomeWatcherクラスを作成しました。ホームボタンと最近のアプリボタンを検出したい希望のクラスにホームウォッチャーを宣言する必要があります。

public class MainActivity extends Activity { 

    private HomeWatcher mHomeWatcher; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
    try { 

      mHomeWatcher = new HomeWatcher(this); 
      mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() { 
       @Override 
       public void onHomePressed() { 
        Log.e(TAG, "onHomePressed"); 


       } 
       @Override 
       public void onHomeLongPressed() { 
        Log.e(TAG, "recent apps"); 

       } 


      }); 
      mHomeWatcher.startWatch(); 
     } catch (Exception e) { 
     } 

    } 

最後に、このようなonPauseメソッドとonResume Overideメソッドを追加するだけです。

@Override 
    protected void onResume() { 
     super.onResume(); 

     try { 
      mHomeWatcher.startWatch(); 

     } catch (Exception e) { 
     } 
    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 

     try { 
      mHomeWatcher.stopWatch(); 

     } catch (Exception e) { 
     } 
} 

非常にシンプルで美しい答えです。投票を待って答えを受け入れました:p

関連する問題