2

2 つのビューを含むアクティビティがあります。1 つのビューが onDraw をオーバーライドし、onTouchEvent を正しく処理します。しかし、2 番目のビューの onKeyDown を取得しようとすると、何も表示されません。代わりに、戻るボタンまたはその他のキーボード ボタンを押すと、onKeyDown が呼び出されます。これはエミュレータでテストされました。

LinearLayout を拡張するカスタム キーパッド ビュー クラスである 2 番目のビューの onKeyDown を取得したいのですが、どうすればこれを行うことができますか? すでに setFocusable(true) と setFocusableInTouchMode(true) を試しましたが、うまくいきません。mySecondView.bringToFront() も試しましたが、成功しませんでした。

どんな助けでも大歓迎です。

編集 - メイン アクティビティの 2 番目のビューに 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

0

onTouchEvent を実装すると、他のユーザー インタラクション インターフェースがオーバーライドされます。したがって、それを実装する場合は、独自のイベントを作成する必要があります。

于 2013-04-16T14:27:48.827 に答える
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 に答える