Подтвердить что ты не робот

Предотвращение переходов через 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);
}
4b9b3361

Ответ 1

Просто позвоните rlTest.setClickable(false). Это предотвратит распространение этого нажатия на детей

Ответ 2

вы можете установить изображение

android:clickable="true"

Ответ 3

Есть намного более чистый способ

Ты можешь использовать:

android:onClick="preventClicks"

в XML и в вашей деятельности

public void preventClicks(View view) {}

Это работает с фрагментами. Пример внутри этого действия имеет несколько фрагментов, накладывающихся друг на друга, просто добавив атрибут XML на фоне вашего фрагмента, он все равно будет вызывать Activity.preventClicks и предотвратит прикосновения к фрагментам позади него.

Ответ 4

В общем случае работает следующее решение:

_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;
    }
});

Он в основном блокирует любые касания от распространения через представление, отмечая событие касания как обработанное. Это работает как с элементами управления пользовательским интерфейсом, так и с макетами (например, LinearLayout, FrameLayout и т.д.).

Решение установить "clickable" как false не работало для меня для контейнеров макета как в коде, так и в XML-представлении.

Ответ 5

Я предполагаю, что вы используете onClickListeners.

Как насчет использования onTouchListener вместо onClickListeners. Поступая таким образом, вы сможете контролировать, насколько глубоко в вашей иерархии ощущается прикосновение. Например, если у вас есть toch-слушатели на относительном макете (RL) и изображении (IV) (содержится в RL), и вы назначаете touchListeners для обоих. Теперь, если вы вернетесь из события IV touch, нижний член RL не получит событие касания. Однако, если вы вернете false из события IV касания, нижний член RL будет принимать событие касания.

Надеюсь это поможет!

Ответ 6

Просто добавьте этих двух слушателей:

    // 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;
        }
    });