web-dev-qa-db-ja.com

ViewGroupを拡張せずにインターセプトタッチイベントを処理する

私は1つのRelativeLayoutを使用しており、このレイアウトには10​​近くのビューがあります。

私はOnTouchListenerをこのレイアウトに設定し、それにいくつかの作業を行ってtrueを返しました。

ビューがない(空の領域の意味)レイアウトにタッチすると、このリスナーは正常に動作します。このレイアウトの子ビューに触れると、このリスナーは起動しません...

ドキュメントから、ViewGroup(ここではRelativeLayout)を拡張することでonInterceptTouchEvent()をオーバーライドし、子ビューがこのイベントを消費する前にタッチイベントを処理できることを理解しました...

これでうまくいきますが、RelativeLayoutをCustomRelativeLayoutに置き換えることで、この機能が必要な多くのxmlファイルを変更する必要があります。

だから私の質問は:

RelativeLayoutの子ビューがイベントを消費する前に、RelativeLayout(もちろんViewGroup)のタッチイベントを処理する方法はありますか? RelativeLayoutを拡張したくない...

28

オーバーライドしてみてください

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    return super.dispatchTouchEvent(ev);
}

/ Activity。このメソッドは、タッチイベントを処理する最初のメソッドです。ただし、この場合は、ビューの現在の座標で作業する必要があります

21
Michael Katkov

_ACTION_DOWN_イベントを処理するときに、子ビューのonTouchEvent()メソッドでfalseを返すようにしてください。したがって、転送タッチイベントは子ビューに送信されず、別名イベントは消費されません。

1
Sophia

必ずしも理想的ではありませんが、これは動的コンテンツを持たない小さなレイアウトに適しています。

Xmlで、_Android:clickable="false"_をレイアウト内のViewGroupのすべての子孫(ネストされたViewGroupとその子を含む)に設定します。クリックされた各子は、クリックを親に伝播し、最終的にViewGroupのデフォルトのタッチハンドラーに到達します。ルートのViewGroupを必ず設定してください。ここで、クリックイベントを_Android:clickable="true"_またはviewgroup.setClickable(true)として取得します。

ビューを動的に追加する場合は、ビュー階層に追加する前に、必ずview.setClickable(false);を呼び出してください。

1
Johnny C

OnTouchListenerをRelativeLayoutに追加してみてください

RelativeLayout rl = (RelativeLayout) findViewById( R.id.relativeLauout );
    rl.setOnTouchListener( new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // do something
            return false;
        }
    });

または、アクティビティのメソッドonTouchEventを使用します

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    return super.onTouchEvent(event);
}
0
kris14an