更新支持库后不调用 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);
}
}
最近我已经将 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);
}
}