更新支持库后不调用 onKeyDown

onKeyDown is not called after updating support library

最近我已经将 android 支持库更新到版本 22.1.0

compile 'com.android.support:support-v4:22.1.0'
compile 'com.android.support:appcompat-v7:22.1.0'

我重写了 onKeyDown 方法,发现在更新库后它没有被调用。如果我回到以前版本的库,它工作正常。

如果用户按键,是否有任何其他方法可以在新的支持库版本中覆盖。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return super.onKeyDown(keyCode, event);
}

我找到了这个解决方案,它不是最好的,但我认为这是唯一可行的。

在您 Activity 的 onCreate 方法中添加这些行:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    try {
        Field mDelegateField = AppCompatActivity.class.getDeclaredField("mDelegate");
        mDelegateField.setAccessible(true);
        Object mDelegate = mDelegateField.get(this);

        Field mWindowField = mDelegate.getClass().getSuperclass().getSuperclass().getDeclaredField("mWindow");
        mWindowField.setAccessible(true);
        Window mWindow = (Window) mWindowField.get(mDelegate);

        Window.Callback mOriginalWindowCallback = mWindow.getCallback();
        mWindow.setCallback(new AppCompatWindowCallbackCustom(mOriginalWindowCallback));
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

在 activity 的 class 中创建此 class:

private class AppCompatWindowCallbackCustom extends WindowCallbackWrapper {

    public AppCompatWindowCallbackCustom(Window.Callback wrapped) {
        super(wrapped);
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        final int keyCode = event.getKeyCode();
        final int action = event.getAction();

        if (keyCode == KeyEvent.KEYCODE_MENU && action == KeyEvent.ACTION_DOWN) {
            // do your stuff
        }

        return super.dispatchKeyEvent(event);
    }
}