问题描述:继承了activity后实现onKeyUp和onKeyDown方法进行按键监听,点击“OK按键”后,onKeyUp和onKeyDown无任何回调,但是界面上有响应(如下图),一个图标被选中并执行了点击事件。
问题分析:此现象应该是“OK按键”的点击事件给系统优先消耗了。未查明原因(新开发板Android10出现的问题, 旧开发板Android7未出现这个问题)
参考原文:
1.https://blog.csdn.net/yxhuang2008/article/details/53822072
2.https://blog.csdn.net/sinat_31311947/article/details/53932310
解决方案:此图片使用的是ImageView。自定义一个类来继承ImageView,实现里面的onKeyPreIme方法并将其返回值返回false。然后实现里面的onKeyUp和onKeyDown方法即可。
注意:此时的onKeyUp和onKeyDown方法是ImageView中的方法。activity中的onKeyUp和onKeyDown方法依旧无法监听到。
源码:
@SuppressLint("AppCompatCustomView") public class MyImageView extends ImageView { public MyImageView(Context context) { super(context); } public MyImageView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public MyImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public MyImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { QLog.e(String.format("图片触发按键: keyCode = %s, event = %s", keyCode, toString(event))); return false; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { QLog.e(String.format("图片22触发按键: keyCode = %s, event = %s", keyCode, toString(event))); return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { QLog.e(String.format("图片333触发按键: keyCode = %s, event = %s", keyCode, toString(event))); return true; } private String toString(KeyEvent event) { return "action = " + event.getAction() + ", code = " + event.getKeyCode() + ",repeat = " + event.getRepeatCount(); } }
运行效果:
感谢! 有其他解决方案的大神们,麻烦发个链接,非常感谢!!!!!!!!!