私は1つのRelativeLayout
を使用しており、このレイアウトには10近くのビューがあります。
私はOnTouchListener
をこのレイアウトに設定し、それにいくつかの作業を行ってtrue
を返しました。
ビューがない(空の領域の意味)レイアウトにタッチすると、このリスナーは正常に動作します。このレイアウトの子ビューに触れると、このリスナーは起動しません...
ドキュメントから、ViewGroup(ここではRelativeLayout)を拡張することでonInterceptTouchEvent()
をオーバーライドし、子ビューがこのイベントを消費する前にタッチイベントを処理できることを理解しました...
これでうまくいきますが、RelativeLayoutをCustomRelativeLayoutに置き換えることで、この機能が必要な多くのxmlファイルを変更する必要があります。
だから私の質問は:
RelativeLayout
の子ビューがイベントを消費する前に、RelativeLayout
(もちろんViewGroup)のタッチイベントを処理する方法はありますか? RelativeLayout
を拡張したくない...
オーバーライドしてみてください
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
/ Activity
。このメソッドは、タッチイベントを処理する最初のメソッドです。ただし、この場合は、ビューの現在の座標で作業する必要があります
_ACTION_DOWN
_イベントを処理するときに、子ビューのonTouchEvent()
メソッドでfalseを返すようにしてください。したがって、転送タッチイベントは子ビューに送信されず、別名イベントは消費されません。
必ずしも理想的ではありませんが、これは動的コンテンツを持たない小さなレイアウトに適しています。
Xmlで、_Android:clickable="false"
_をレイアウト内のViewGroupのすべての子孫(ネストされたViewGroupとその子を含む)に設定します。クリックされた各子は、クリックを親に伝播し、最終的にViewGroupのデフォルトのタッチハンドラーに到達します。ルートのViewGroupを必ず設定してください。ここで、クリックイベントを_Android:clickable="true"
_またはviewgroup.setClickable(true)
として取得します。
ビューを動的に追加する場合は、ビュー階層に追加する前に、必ずview.setClickable(false);
を呼び出してください。
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);
}