onDraw都可以,但onKeyDown却不可以。这是为什么?
public class Chessboard extends View {
private final Paint paint = new Paint();
//构造
public Chessboard(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setColor(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
//成功画了一根线
canvas.drawLine(0, 0, 100, 100, paint);
}
//监听键盘事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
return true;
}
}
public class Chessboard extends View {
private final Paint paint = new Paint();
//构造
public Chessboard(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setColor(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
//成功画了一根线
canvas.drawLine(0, 0, 100, 100, paint);
}
//监听键盘事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
return true;
}
}
//监听键盘事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
System.out.println("test"); //在这里打个断点 代码没问题
return true;
}
还有Activity里面如果也有键盘监听也可能出现无效的问题
调试模式下,打了断点,不会进入。所以知道不行。下面打了一些log,就更清楚了。
重载的函数onDraw进入一次。
重载的函数onTouchEvent点触摸屏,就会进入。
重载的函数onKeyDown点键盘,没反应。因为Chessboard extends View,重载了三个函数,却独独它【onKeyDown】的重载没反应。
这是不是说,onKeyDown仅重载,不能保证有效,还欠缺了什么?在此,想问问大家,是不是还漏了什么步骤?
//棋盘
public class Chessboard extends View {
//构造
public Chessboard(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
Log.v("Chessboard", "onDraw");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.v("Chessboard", "onTouchEvent");
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
Log.v("Chessboard", "onKeyDown");
return true;
}
}
点击屏幕或者点击home键盘,back键盘,都不进入onKeyDown?
v.setFocusableInTouchMode(true);
不行的话Foucasable都搞成True看看
在:
public Chessboard(Context context, AttributeSet attrs) {
super(context, attrs);
}
中,加上
setFocusable(true);或
setFocusableInTouchMode(true);键盘事件都能响应了!
这俩个函数,看起来不太一样。但功效都OK的。