Ответ 1
tv.setClickable(true);
вызывает ваш макет, а не срабатывает сенсорное событие. Попробуйте удалить это.
У меня есть 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>
tv.setClickable(true);
вызывает ваш макет, а не срабатывает сенсорное событие. Попробуйте удалить это.
В myRelativeLayout.xml добавьте:
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
Это сработало для меня:
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
}
});
Возможно, что-то, на ваш взгляд, "сверху" myRelativeLayout. Если это так, он сначала получает событие касания. Хуже всего то, что обработка событий по умолчанию - это ничего не делать с событием, а затем потреблять его.
Одним из решений было бы добавить этот код в какие-либо компоненты вашего дисплея "выше" View (или Layout), которые ДОЛЖНЫ обрабатывать событие:
someView.setOnTouchListener (new View.OnTouchListener()
{
@Override
public boolean onTouch (View v, MotionEvent event)
{
return false;
}
});
Ключ (очевидно) должен возвращать значение false. Когда вы это сделаете, событие не будет потреблено, а скорее передано "вниз" на что-то в вашем относительном расположении - надеюсь, где-то вы захотите, чтобы он ушел.
Я знаю, что это не решение вашей проблемы, но ваша была самой близкой к моей проблеме, поэтому, возможно, это поможет кому-то еще.
Несмотря на то, что это похоже на конструктор, макет не является "широкоэкранным" на самом деле с некоторыми настройками.
Ширина обернута, Нет события перехода в дополнение/макет
<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"
Вы должны установить в свой RelativeLayout
этот атрибут true: android:clickable="true"