如何在片段内实现水平滑动?

4

我有一个activity里面有两个fragment,我想在其中一个fragment实现滑动效果。我的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/image_list_fragment"
        android:name="com.example.fragments.QGridFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="100" >
    </fragment>

    <fragment
        android:id="@+id/image_viewer_fragment"
        android:name="com.example.fragments.QViewerFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="85" />

</LinearLayout>

我希望在image_viewer_fragment片段中实现滑动操作。 我正在寻找一种使用ViewPagerGestureListener的方法。 对于没有片段的普通活动,我可以使用方法。


在 Fragment 中,滑动的主要目的是什么? - Ravi Sharma
@RaviSharma 这个活动通过片段分为两部分,我只想在一个片段中检测滑动手势。如果用户向左/右滑动,我将执行一些操作。 - user1310152
你可以在Fragment中的视图上添加setOnTouchListener,并在onTouch方法中检测滑动,然后调用父Activity来更改Fragment。此外,您还需要更改XML中的静态片段以使用FrameLayout,以便您可以从父活动更改片段。 - Naveen
1个回答

2
我试着在我的应用中实现滑动功能,为此我创建了一个类 SwipeDetector 实现 OnTouchListener 接口。
以下是代码:
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class SwipeDetector implements OnTouchListener {

    public static enum Action {
        LR, // Left to Right
        RL, // Right to Left
        TB, // Top to bottom
        BT, // Bottom to Top
        None, // when no action was detected
        Click
    }

    private static final String logTag = "SwipeDetector";
    private static final int MIN_DISTANCE = 100;
    private float downX, downY, upX, upY;
    private Action mSwipeDetected = Action.None;

    public boolean swipeDetected() {
        return mSwipeDetected != Action.None;
    }

    public Action getAction() {
        return mSwipeDetected;
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            downX = event.getX();
            downY = event.getY();
            mSwipeDetected = Action.None;
            // Log.i(logTag, "Click On List" );
            return false; // allow other events like Click to be processed
        }
        case MotionEvent.ACTION_UP: {
            upX = event.getX();
            upY = event.getY();

            float deltaX = downX - upX;
            float deltaY = downY - upY;

            // horizontal swipe detection
            if (Math.abs(deltaX) > MIN_DISTANCE) {
                // left or right
                if (deltaX < 0) {

                    mSwipeDetected = Action.LR;
                    return false;
                }
                if (deltaX > 0) {

                    mSwipeDetected = Action.RL;
                    return false;
                }
            }
            /*
             * else
             * 
             * // vertical swipe detection if (Math.abs(deltaY) > MIN_DISTANCE)
             * { // top or down if (deltaY < 0) { Log.i(logTag,
             * "Swipe Top to Bottom"); mSwipeDetected = Action.TB; return false;
             * } if (deltaY > 0) { Log.i(logTag, "Swipe Bottom to Top");
             * mSwipeDetected = Action.BT; return false; } }
             */

            mSwipeDetected = Action.Click;
            return false;
        }
        }
        return false;
    }

}

在你想要添加滑动操作的碎片的 onCreateView 方法中,通过在视图的 setOnTouchListener 方法中设置 SwipeDetector 来实现它。
像这样:
SwipeDetector swipeDetector = new SwipeDetector();
view.setOnTouchListener(swipeDetector);

if (swipeDetector.getAction() == Action.LR) {
   //Do some action
}

3
我尝试过这个,但我的监听器方法没有被触发。 - Danyal Aytekin
相同,它没有触发这些方法。 - Giriteja Bille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接