在Android中检测物理菜单键按下

时间:2010-11-21 19:33:40

标签: android button

我正在尝试检测Android手机上的物理菜单按钮何时被按下。我虽然下面的代码可以工作,但事实并非如此。我哪里出错了?

返回的错误是'onKeyDown参数的非法修饰符;只允许最终'

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

6 个答案:

答案 0 :(得分:82)

我会使用onKeyUp寻找 up 键事件,而不是 down 事件。

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

我们返回true因为我们正在处理这个事件;如果您希望系统也处理该事件,请返回false

您也可以在Activity实例中执行所有这些操作,因为ActivityKeyEvent的已知间接子类。

答案 1 :(得分:11)

基于以上所有内容,这似乎是正确的实现,它将仅使用菜单键“up”事件并将其他键事件传递给超类。

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

答案 2 :(得分:5)

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 :(得分:1)

确保在Activity类中覆盖onKeyDown方法。 View类中还有另一个onKeyDown方法,但如果按下菜单键则不会调用它。

答案 4 :(得分:0)

如果您确实处理了事件,则返回true,如果您没有返回false,那么Android系统可以将事件传递给其余组件来处理它。

答案 5 :(得分:-2)

我对这个问题有一个很酷的答案 我从过去1年开始尝试过它,并找到了解决方案。

请看下面的答案。

创建一个名为HomeWatcher的类。 正确使用以下代码,名称为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