web-dev-qa-db-ja.com

Android ImageVIewのクリックスルーを防止しますか?

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);
}
20
Apqu

単にrlTest.setClickable(false)を呼び出します。これにより、クリックが子に伝達されなくなります

18
Blackbelt

画像を次のように設定できます

Android:clickable="true"
35
Kirill Kulakov

もっとすっきりした方法があります

以下を使用できます。

Android:onClick="preventClicks"

xMLとあなたの活動で

public void preventClicks(View view) {}

これはフラグメントで機能します。このアクティビティ内の例には、複数のフラグメントが互いに重なっています。フラグメントの背景にXML属性を追加するだけで、Activity.preventClicksが呼び出され、その背後のフラグメントへの接触が防止されます

9

次の解決策は、一般的なケースで機能します。

_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でも機能しませんでした。

4
Marchy

私はあなたがonClickListenersを使用していると思います。

OnClickListenersの代わりにonTouchListenerを使用するのはどうでしょう。これを行うことで、タッチが表示される階層の深さを制御できます。たとえば、relative-layout(RL)とimage-view(IV)(RLに含まれる)でリスナーを切り替えて、touchListenersを両方に割り当てたとします。ここで、IVのタッチイベントからreturn trueの場合、下位のメンバーRLはタッチイベントを受け取りません。ただし、return falseの場合IVのタッチイベントから、下位のメンバーRLがタッチイベントを受け取ります。

お役に立てれば!

1
Parth Kapoor

次の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;
        }
    });
1
Andrei Lupsa