4

私がやろうとしているのは、次のような外部クラスから戻るボタンの押下をインターセプトすることです:

public class AnswerView extends RelativeLayout {

    public AnswerView(Context context) {
        super(context);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            Log.i("AlleAntwoorden", "Back button pressed!");
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

メインのアクティビティから次のように追加しています。

RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main_layout);
mainLayout.addView(new AnswerView(this));
4

1 に答える 1

7

ビューがイベントを受信するには、フォーカスが必要です。XMLが表示されないので、実行時にいくつかの特性を追加しましょう。

AnswerView layout = new AnswerView(this);
layout.setFocusableInTouchMode(true);
layout.requestFocus();
mainLayout.addView(layout);

これで、レイアウトはの戻るボタンをインターセプトしますOnKeyListener。ただし、別のビューにフォーカスがある場合、子ビューであっても、イベントは最初に子によって消費される可能性があります。
これを理解するには、AnswerViewにEditTextを追加します。

layout.addView(new EditText());

EditTextにフォーカスがあるときに戻るボタンをクリックすると、最初のクリックでソフトキーボードが閉じ、2回目のクリックで現在のアクティビティが通常どおり終了します。OnKeyListenerデフォルトでは、イベントはビュー階層を介して渡されません。

于 2012-09-13T16:41:43.830 に答える