2011-05-06 118 views
0

我有一個帶有一些嵌套LinearLayouts,ImageView和TextViews的LinearLayout。其中一個TextView有滾動條。我在我的LinearLayout類中覆蓋了onTouchEvent()方法,但是當您使用滾動條觸摸TextView時,什麼也沒有註冊。Android沒有在滾動條的TextView上接收觸摸事件

這裏是我的xml文件(有關TextView的是此佈局中的最後一項):

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:minWidth="310dp" 
    android:layout_width="fill_parent"> 
    <LinearLayout 
     android:id="@+id/from_linear_layout" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="left"> 
     <ImageView 
      android:src="@drawable/ic_dialog_info" 
      android:id="@+id/notification_type_icon_image_view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:scaleType="center" 
      android:layout_margin="4dp"/> 
      <TextView 
       android:id="@+id/time_text_view" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center_vertical" 
       android:text="Timestamp" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:padding="1dp" 
       android:textColorLink="?android:attr/textColorPrimaryDisableOnly"/> 
    </LinearLayout> 
    <ImageView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/under_contact_image_view" 
     android:src="@drawable/divider_horizontal_dark" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitXY" 
     android:paddingLeft="5dp" 
     android:paddingRight="5dp" 
     android:paddingBottom="2dp" 
     android:paddingTop="2dp" /> 
    <TextView 
     android:text="Notification Text" 
     android:id="@+id/notification_text_view" 
     android:autoLink="all" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="?android:attr/textColorPrimaryDisableOnly" 
     android:layout_width="fill_parent" 
     android:gravity="left" 
     android:paddingRight="10dp" 
     android:paddingLeft="10dp" 
     android:textColorLink="?android:attr/textColorPrimaryDisableOnly" 
     android:layout_gravity="left" 
     android:layout_height="70dip" 
     android:scrollbars="vertical"/> 
</LinearLayout> 

關於這一點,如果是的話有什麼想法,有沒有人知道如何克服這讓我可以實現在這個TextView觸摸事件?

+0

如果您向'LinearLayout'添加'android:focusable'和'android:clickable',會發生什麼? – 2011-05-10 14:26:48

+0

你不需要「擴展」LinearLayout來覆蓋onTouchEvent嗎?如果您確實擴展了該類,則需要將LinearLayout放入XML中,而不是通用的LinearLayout。 – 2011-05-10 14:45:11

回答

1

我討厭回答我自己的問題,但我終於明白了這一點。基本上,你必須攔截活動發送的觸摸事件。在攔截功能中,您可以確定要處理的觸摸事件以及要讓哪些事件通過活動和其他子項目。

這就是我讓我在捕捉所有其他觸摸事件時(例如,可以上下滾動,長按,按下按鈕事件)捕捉「滑動」或「一甩」事件的功能。

MotionEvent _downMotionEvent; 

/** 
* This function intercepts all the touch events. 
* In here we decide what to pass on to child items and what to handle ourselves. 
* 
* @param motionEvent - The touch event that occured. 
*/ 
@Override 
public boolean dispatchTouchEvent(MotionEvent motionEvent){ 
    if (_debug) Log.v("NotificationActivity.dispatchTouchEvent()"); 
    NotificationViewFlipper notificationViewFlipper = getNotificationViewFlipper(); 
    switch (motionEvent.getAction()){ 
     case MotionEvent.ACTION_DOWN:{ 
      //Keep track of the starting down-event. 
      _downMotionEvent = MotionEvent.obtain(motionEvent); 
      break; 
     } 
     case MotionEvent.ACTION_UP:{ 
      //Consume if necessary and perform the fling/swipe action 
      //if it has been determined to be a fling/swipe 
      float deltaX = motionEvent.getX() - _downMotionEvent.getX(); 
      final ViewConfiguration viewConfiguration = ViewConfiguration.get(_context); 
      if(Math.abs(deltaX) > viewConfiguration.getScaledTouchSlop()*2){ 
       if (deltaX < 0){ 
        //Do work here for right direction swipes. 
        return true; 
       }else if (deltaX > 0){ 
        //Do work here for left direction swipes. 
        return true; 
       } 
      } 
      break; 
     } 
    } 
    return super.dispatchTouchEvent(motionEvent); 
} 

我希望這可以幫助任何遇到類似問題的人。

+0

使用什麼來代替不推薦的ViewConfiguration構造函數? – topwik 2012-08-30 16:03:45

+1

@Towpse - 你想做以下事情(我更新了答案以反映這一點):final ViewConfiguration viewConfiguration = ViewConfiguration.get(_context); – 2012-08-31 16:08:10