2012-06-24 2 views
15

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

Этот код определяет события прикосновения просто отлично:

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

Но когда я добавляю все эти TextViews в 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> 

ответ

8
tv.setClickable(true); 

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

+1

, но тогда это не значит, что текстовое изображение не сможет быть сфокусировано, прикоснувшись к нему? –

+0

Каким образом настройка Clickable disable отключает касания, я думал, что это позволит. – mskw

+0

Это более удобно, спасибо тоже –

0

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

+0

не работает, уже сделал –

+1

Это не сработало, потому что переключатель android: clickable относится к использованию clickListener, а не к touchListener. – Rich

17

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

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

Я уже пробовал это. Это не влияет.Посмотрите на дополнения, которые я сделал –

+0

Это работает для меня спасибо –

+0

это работает для меня – ashraful

13

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

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

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

Одно решение было бы добавить этот код на любые компоненты дисплея являются «сверху» View (или макет), который должен обрабатывать событие:

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

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

1

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

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

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

<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" 

С матчем родителем, Tap события обжига

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
Смежные вопросы