Android Как вызывать OnFling при перелистывании в любом месте действия, а не только в ViewFlipper - PullRequest
3 голосов
/ 30 сентября 2011

В моем viewFlipper некоторые TextViews загружаются динамически. Размер может отличаться, что означает, что под viewFlipper может остаться некоторое пространство (см. Зеленую часть на скриншоте)

Скриншот

Я хочу, чтобы метод onFling вызывался не только при смахивании на серую часть (которая является видоискателем), но и при смахивании на зеленую часть

мой макет выглядит так:

<?xml version="1.0" encoding="utf-8"?>

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/root">


<ViewFlipper android:id="@+id/viewFlipper"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">       
</ViewFlipper>

 </RelativeLayout>

В моем onCreate я делаю это:

this.viewFlipper = (ViewFlipper) this.findViewById(R.id.viewFlipper);

    this.gestureDetector = new GestureDetector(new MyGestureDetector());

    RelativeLayout root = (RelativeLayout) this.findViewById(R.id.root);
    root.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (gestureDetector.onTouchEvent(event)) {
                Log.d("root", "true");
                return false;
            } else {
                Log.d("root", "false");
                return false;
            }
        }
    });

До сих пор я пытался вернуть false, даже если я получаю значение true, чтобы событие не использовалось и передавалось в viewFlipper, даже если свип был сделан за пределами видоискателя.

Обратите внимание, что viewFlipper не требует явного onTouchListener. Это работает с или без (я не очень понимаю, почему ..)

Кто-нибудь знает, что делать?

1 Ответ

8 голосов
/ 30 сентября 2011

Попробуйте добавить android:clickable="true" к вашему RelativeLayout, и вы сможете это сделать.

Если это не сработает, вам может понадобиться реализовать эти два метода (если вы еще не все):

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    //TouchEvent dispatcher.
    if (gestureDetector != null) {
        if (gestureDetector.onTouchEvent(ev))
            //If the gestureDetector handles the event, a swipe has been executed and no more needs to be done.
            return true;
    }
    return super.dispatchTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}
...