我有一个包含两个视图的活动。一个视图覆盖onDraw,并正确处理onTouchEvent。但是当我试图为第二个视图检索onKeyDown时,它什么都没给我。相反,当我按下后退按钮或任何其他键盘按钮时,会调用onKeyDown。这是在模拟器中测试的。
我想为我的第二个视图检索onKeyDown,这是一个扩展LinearLayout的自定义键盘视图类,我该怎么做呢?我已经尝试过setFocusable(true)和setFocusableInTouchMode(true),但这不起作用。我也试过mySecondView.bringToFront(),也没有成功。
任何帮助都将不胜感激。
编辑 - 尝试将onClickListener添加到主活动中的第二个视图。没被打电话。
public class TrialActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d(TRIALTAG,"Inside on create");
setContentView(R.layout.trial_activity);
keypadView = findViewById(R.id.keypad);
selNumber = 0;
keypadView.bringToFront();
keypadView.setFocusable(true); //NOT WORKING
keypadView.setFocusableInTouchMode(true); //NOT WORKING
keypadView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// NOT WORKING
Log.d(TRIALTAG,"Inside on click on the keypad");
}
});
}
public class TrialView extends View{
@Override
public boolean onTouchEvent(MotionEvent event){ //IS GETTING CALLED
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
selX = (int)event.getX();
selY = (int)event.getY();
Log.d(TTAG,"Touch X : " + selX + " Touch Y : " + selY);
getRect(selX, selY);
}
return true;
}
....
}
public class CustomKeyPad extends LinearLayout{
@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
Log.d(KTAG, "Inside keypad on key down"); //NOT GETTING CALLED
switch(keyCode){
case KeyEvent.KEYCODE_1:selectedNumber = 1;
isNumberSelected = true;
break;
default:selectedNumber = 0;
isNumberSelected = false;
break;
}
if(isNumberSelected == true){
Log.d(KTAG, "Is selected is true calling update puzzle");
trialActivity.updatePuzzle(selectedNumber);
}
return true;
}
编辑2 - 将setOnTouchListener放在我的CustomKeypad视图类之后,我发现单击此视图中的任何按钮会导致调用TrialBoard视图类的onTouchEvent(),但是单击键周围的任何位置,但是CustomKeypad视图实际上在我的主要活动中触发了onTouchListener ......我不知道为什么会这样......:(
答案 0 :(得分:0)
如果实现onTouchEvent,它将覆盖其他用户交互界面。所以如果你实现它,你需要编写自己的事件。
答案 1 :(得分:0)
尝试覆盖扩展LinearLayout
的自定义键盘类中的OnKeyDown方法public class YourCustomKeypadLinearLayout extends LinearLayout {
public YourCustomKeypadLinearLayout(Context context) {
super(context);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if( keyCode == YourKeyCode ){
//do sth
}
else{
return super.onKeyDown(keyCode, event);
}
}
}
答案 2 :(得分:0)
触摸事件可能被消耗,当未处理触摸事件时,您应该尝试返回false或调用超类方法。
public boolean onTouchEvent(MotionEvent event){ //IS GETTING CALLED
if(event.getAction() == MotionEvent.ACTION_DOWN){
selX = (int)event.getX();
selY = (int)event.getY();
Log.d(TTAG,"Touch X : " + selX + " Touch Y : " + selY);
getRect(selX, selY);
return true;
} else {
return super.onTouchEvent(event);
}