ImageView
の内側にRelativeLayout
オーバーレイがあり、クリックがImageView
を通過してその背後にあるボタンなどに到達しないようにしたい(そのため、実質的に全体を無効にする) RelativeLayout
)。
これを行う最も簡単な方法は、RelativeLayoutビューを繰り返し、現在このコードを使用して実行しているように、ビューを無効に設定することです。
RelativeLayout rlTest = (RelativeLayout ) findViewById(R.id.rlTest);
for (int i = 0; i < rlTest.getChildCount(); i++) {
View view = rlTest.getChildAt(i);
view.setEnabled(true);
}
単にrlTest.setClickable(false)
を呼び出します。これにより、クリックが子に伝達されなくなります
画像を次のように設定できます
Android:clickable="true"
もっとすっきりした方法があります
以下を使用できます。
Android:onClick="preventClicks"
xMLとあなたの活動で
public void preventClicks(View view) {}
これはフラグメントで機能します。このアクティビティ内の例には、複数のフラグメントが互いに重なっています。フラグメントの背景にXML属性を追加するだけで、Activity.preventClicksが呼び出され、その背後のフラグメントへの接触が防止されます
次の解決策は、一般的なケースで機能します。
_container.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// NOTE: This prevents the touches from propagating through the view and incorrectly invoking the button behind it
return true;
}
});
基本的には、タッチイベントに処理済みのマークを付けることで、ビューへのタッチの伝播をブロックします。これは、UIコントロールとレイアウトコンテナー(LinearLayout、FrameLayoutなど)の両方で機能します。
「クリック可能」をfalseに設定するソリューションは、レイアウトコンテナーのコードでもビューXMLでも機能しませんでした。
私はあなたがonClickListenersを使用していると思います。
OnClickListenersの代わりにonTouchListenerを使用するのはどうでしょう。これを行うことで、タッチが表示される階層の深さを制御できます。たとえば、relative-layout(RL)とimage-view(IV)(RLに含まれる)でリスナーを切り替えて、touchListenersを両方に割り当てたとします。ここで、IVのタッチイベントからreturn trueの場合、下位のメンバーRLはタッチイベントを受け取りません。ただし、return falseの場合IVのタッチイベントから、下位のメンバーRLがタッチイベントを受け取ります。
お役に立てれば!
次の2つのリスナーを追加するだけです。
// Set an OnTouchListener to always return true for onTouch events so that a touch
// sequence cannot pass through the item to the item below.
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
return true;
}
});
// Set an OnHoverListener to always return true for onHover events so that focus cannot
// pass through the item to the item below.
view.setOnHoverListener(new OnHoverListener() {
@Override
public boolean onHover(View v, MotionEvent event) {
v.onHoverEvent(event);
return true;
}
});