2

我有一个包含两个视图的活动。一个视图覆盖 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 - 在我的 CustomKeypad 视图类上放置 setOnTouchListener 后,我发现单击此视图中的任何按钮都会导致调用 TrialBoard 视图类的 onTouchEvent(),但单击键周围的任何位置,但在 CustomKeypad 视图中实际上在我的主要活动中触发了 onTouchListener...我不知道为什么会这样...:(

4

3 回答 3

1

尝试在扩展 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);
    }

}

}
于 2013-04-16T14:53:24.737 回答
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);
}
于 2013-04-16T15:57:39.313 回答
0

如果您实现 onTouchEvent,它会覆盖其他用户交互界面。所以如果你实现它,你需要编写自己的事件。

于 2013-04-16T14:27:48.827 回答