Android не получает сенсорного события в TextView с полосами прокрутки - PullRequest
0 голосов
/ 06 мая 2011

У меня есть LinearLayout с некоторыми вложенными LinearLayout, ImageView и TextView. У одного из TextView есть полосы прокрутки. У меня есть метод onTouchEvent (), переопределенный в моем классе LinearLayout, но когда вы касаетесь 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 Ответ

1 голос
/ 09 июня 2011

Ненавижу отвечать на свой вопрос, но наконец-то понял.По сути, вы должны перехватить события касания, которые отправляет действие.Затем в функции перехвата вы можете определить, какие сенсорные события вы хотите обработать, и какие события вы хотите пропустить через Activity и другие дочерние элементы.

Вот то, что у меня было, что позволило мне захватить «свайп»"или" бросить "события, пропуская все другие события касания (например, он позволяет прокручивать вверх и вниз, длительное нажатие, события нажатия кнопки).

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

Я надеюсь, что это поможет любому, кто столкнулсяаналогичная проблема.

...