OnTouchListener не работает с относительной компоновкой

У меня есть RelativeLayout, в котором я добавляю много TextViews динамически. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я применяю прослушиватель onTouch к TextViews индивидуально, он обнаруживает касания, но когда я добавляю прикосновение к моему относительному расположению, он никогда не отвечает.

Этот код обнаруживает события касания просто:

TextView tv = new TextView(this);
tv.setText(values[i]);
Drawable d = getResources().getDrawable(R.drawable.level_small_corners);

tv.setClickable(true);
tv.setId(i+1);
tv.setTextSize(18);
tv.setOnTouchListener(cellTouch);

Но когда я добавляю все эти текстовые элементы в myRelativeLayout:

myRelativeLayout.setOnTouchListener(cellTouch);

Теперь, onTouchListener никогда не вызывается. Почему это так?

 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@android:color/black"
    >
    .
    .
    .

    <ScrollView 
             android:layout_width="fill_parent" 
             android:layout_height="wrap_content"
             android:layout_below="@+id/levelFirstLayout"
             android:layout_marginBottom="70dp"
             > 

        <RelativeLayout  

             android:id="@+id/wordsRelativeLayout"
             android:layout_width="fill_parent" 
             android:clickable="true"   
             android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"

            >
        </RelativeLayout>

        </ScrollView> 
    .
    .
    .
        </RelativeLayout>

Ответы

Ответ 1

tv.setClickable(true);

вызывает ваш макет, а не срабатывает сенсорное событие. Попробуйте удалить это.

Ответ 2

В myRelativeLayout.xml добавьте:

android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"

Ответ 3

Это сработало для меня:

yourRelativeLayout.setOnTouchListener(new View.OnTouchListener() {  
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        //gesture detector to detect swipe.
        gestureDetector.onTouchEvent(arg1);
        return true;//always return true to consume event
    }
});

Ответ 4

Возможно, что-то, на ваш взгляд, "сверху" myRelativeLayout. Если это так, он сначала получает событие касания. Хуже всего то, что обработка событий по умолчанию - это ничего не делать с событием, а затем потреблять его.

Одним из решений было бы добавить этот код в какие-либо компоненты вашего дисплея "выше" View (или Layout), которые ДОЛЖНЫ обрабатывать событие:

someView.setOnTouchListener (new View.OnTouchListener()
{
    @Override
    public boolean onTouch (View v, MotionEvent event)
    {
        return false;
    }
});

Ключ (очевидно) должен возвращать значение false. Когда вы это сделаете, событие не будет потреблено, а скорее передано "вниз" на что-то в вашем относительном расположении - надеюсь, где-то вы захотите, чтобы он ушел.

Ответ 5

Я знаю, что это не решение вашей проблемы, но ваша была самой близкой к моей проблеме, поэтому, возможно, это поможет кому-то еще.

Несмотря на то, что это похоже на конструктор, макет не является "широкоэкранным" на самом деле с некоторыми настройками.

Ширина обернута, Нет события перехода в дополнение/макет

<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

Или это, Нет события нажатия в дополнении/макете

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="0dip"
            android:layout_height="fill_parent"

При совпадении с родителем События нажатия стреляют

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

Ответ 6

Вы должны установить в свой RelativeLayout этот атрибут true: android:clickable="true"