12

アクティビティのルートレベルに ViewPager があります。

ページャーの各ページには ListFragment が含まれています (FragmentPagerAdapter によってサポートされています)。

一部のリスト ビュー アイテムには、それらのアイテムのコンテンツのスワイプをサポートするために追加の ViewPager を含める必要があります (例: リスト アイテム内の水平ギャラリー)。

ビューページャーをネストするにはどうすればよいですか? ViewPager -> ListView (ページ内) -> ViewPager (リスト項目内)

ListFragments の間を横方向にスワイプしたり、リスト全体を縦方向にスワイプしたりできますが、リスト アイテム内をスワイプすることはできません。

4

3 に答える 3

3

これは最適なインタラクション設計ではありませんが、ルートレベル アクティビティのdispatchTouchEvent(MotionEvent ev)メソッドを上書きし、mainPager と現在の ListView でrequestDisallowInterceptTouchEvent(true)を使用して他のスクロールを防止することで実装できます。この例を見てください:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {

    Fragment listFragment = getSupportFragmentManager().findFragmentByTag(
            "android:switcher:" + R.id.pager + ":" + (mainPager.getCurrentItem()));
    mainPager.getChildAt(mainPager.getCurrentItem());
    if (listFragment == null)
        return super.dispatchTouchEvent(ev);
    ViewPager embeddedPager = (ViewPager) listFragment.getView().findViewById(R.id.videopager);
    if (embeddedPager != null) {
        int[] position = new int[2];
        embeddedPager.getLocationOnScreen(position);
        if (ev.getY() > position[1] && ev.getY() < position[1] + embeddedPager.getHeight()) {
            mainPager.requestDisallowInterceptTouchEvent(true);
            if (embeddedPager.getScrollX() % embeddedPager.getWidth() != 0) {
                ListView listView = (ListView) listFragment.getView().findViewById(
                        android.R.id.list);
                listView.requestDisallowInterceptTouchEvent(true);
            }
        }
    }

    return super.dispatchTouchEvent(ev);
}
于 2012-10-12T09:44:12.820 に答える
0

それらを制御するために同じジェスチャーを必要とする要素を実際にネストすることはできません。ビューページャーはすでに水平方向の動きをキャプチャしているため、ネストされた要素はそれを取得できません。おそらく、フォーカスなどを管理することでこれを回避するために多くの作業を行うことができますが、最終的にはアプリがユーザーにとって混乱を招くことになります。同じインタラクションを使用する要素をネストしない方が本当に良いです...この場合、2つのビューページャーが両方とも左右の動きを監視しています。

于 2012-04-28T16:36:00.170 に答える