Android没有使用滚动条在TextView上接收触摸事件

时间:2011-05-06 18:33:20

标签: android events touch textview

我有一个LinearLayout,包含一些嵌套的LinearLayouts,ImageView和TextViews。其中一个TextView有滚动条。我在我的LinearLayout类中覆盖了onTouchEvent()方法,但是当您使用滚动条触摸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上实现触摸事件?

1 个答案:

答案 0 :(得分: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);
}

我希望这可以帮助遇到类似问题的其他人。