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.
精彩评论