开发者

Android not receiving touch event on a TextView with scrollbars

I have a LinearLayout with some nested LinearLayouts, ImageView's and TextViews. One of the TextView's have scroll bars. I have the onTouchEvent() method overriden in my LinearLayout class but when you touch the TextView with the scroll bar nothing registers.

Here is my xml file (the TextView in question is the last item in this layout):

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

Any thoughts on this and if so, does anyone know how to overcome this so that I can implement a touch event on this TextView?


I hate to answer my own question but I finally figured this one out. Basically, you must intercept the touch events that the Activity is sent. In the intercept function you can then determine what touch events you want to handle and what events you want to let pass through to the Activity and other child items.

Here is what I had that enabled me to capture "swipe" or "fling" events while letting all other touch events through (e.g. it lets scroll up and down, long press, button press events through).

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

I hope that this helps anyone else who ran into a similar problem.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜