更新支持库后不调用onKeyDown

时间:2015-04-24 05:59:08

标签: android android-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);
}

1 个答案:

答案 0 :(得分:1)

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

在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();
    }
}

在您的活动类中创建此类:

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