1

水平方向にスクロール可能なViewPagerを作成したいと思います。私のViewPagerにはフラグメントが含まれています。各フラグメントの幅は画面よりも大きいため、スクロールを有効にする必要があります。

フラグメントアイテムには次のレイアウトを使用します。

<HorizontalScrollView
        android:id="@+id/view_horizontal_scroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:isScrollContainer="true" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:orientation="horizontal" >

            <View
                android:layout_width="100dp"
                android:layout_height="fill_parent"
                android:background="#AABBCC" />

            <View
                android:id="@+id/test"
                android:layout_width="1500dp"
                android:layout_height="fill_parent" />

            <View
                android:layout_width="100dp"
                android:layout_height="fill_parent"
                android:background="#ccBBaa" />
        </LinearLayout>
    </HorizontalScrollView>

また、水平スクロールを可能にするカスタムViewPagerを作成しました。

public class ScrollableViewPager extends ViewPager {

    private GestureDetector mGestureDetector;

    public ScrollableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(getContext(),
                new YScrollDetector());
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // Tell our parent to stop intercepting our events!
        getParent().requestDisallowInterceptTouchEvent(true);

        return super.onInterceptTouchEvent(ev)
                && mGestureDetector.onTouchEvent(ev);
    }
}

YScrollDetectorは、onScrollMethodのみを上書きします。ここまでは順調ですね。水平スクロールは正常に機能します。

しかし今、私は問題を抱えています:

5つのフラグメント([0]、[1]、[2]、[3]、[4])を含むViewPagerがあり、アイテム[2]から始めたいとします。後ろ向きにシフトするときは、前のアイテム[1]のスクロール位置が0ではなく右の最大値になるようにします。

私のFramgentsは次のようになります:

public class AbstractFragment extends Fragment {

    private static final String _ID = "ID";
    private int _id;
    private ScrollableViewPager mPager;

    public AbstractFragment() {

    }

    public AbstractFragment(int id, int colorId) {
        this._id = id;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(getClass().getSimpleName(), "[" + _id + "]: onCreate");
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            _id = savedInstanceState.getInt(_ID);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View fragmentView = inflater.inflate(R.layout.fragment_menu_container,
                container, false);

        setUpScrollView(fragmentView);

        return fragmentView;
    }

    @Override
    public void onResume() {
        Log.d(getClass().getSimpleName(), "[" + _id + "]: onResume");
        setUpScrollView(getView());
        super.onResume();
    }

    private void setUpScrollView(View fragmentView) {
        if (fragmentView == null) {
            return;
        }
        HorizontalScrollView scrollView = (HorizontalScrollView) fragmentView
                .findViewById(R.id.view_horizontal_scroll);

        if (scrollView != null) {
            int currentItem = getCurrentPagerItem();
            if (_id < currentItem) {
                // previous Item : X Scroll: width of content
                View content = scrollView.getChildAt(0);
                int width = content.getRight();
                width = width - scrollView.getRight();
                scrollView.scrollTo(width, 0);
                Log.d(getClass().getSimpleName(), "[" + _id + "] width: "
                        + width);
                // scrollView.fullScroll(View.FOCUS_RIGHT);
            } else if (_id > currentItem) {
                // next Item - X Scroll: 0
                scrollView.fullScroll(View.FOCUS_LEFT);
            } else {
                // current Item - Nothing to do her
            }

        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        if (outState == null) {
            return;
        }

        outState.putInt(_ID, _id);
    }

    private ScrollableViewPager getPager() {
        PagerActivity activity = (PagerActivity) getActivity();
        return activity.getViewPager();
    }

    private int getCurrentPagerItem() {
        if (mPager == null) {
            mPager = getPager();
        }

        return mPager.getCurrentItem();
    }
}

私のフラグメントでは、前のフラグメントのスクロール位置を設定したいと思います。ただし、ScrollViewとContentViewの幅は両方とも0であるため、これは機能しません。

誰かが答えを知っていますか?ありがとう!!!

4

1 に答える 1

2

私は自分で解決策を見つけました:

private void setUpScrollView(final ViewGroup fragmentView) {
        if (fragmentView == null) {
            return;
        }

        fragmentView.getViewTreeObserver().addOnGlobalLayoutListener(
                new OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        HorizontalScrollView scrollView = (HorizontalScrollView) fragmentView
                                .findViewById(R.id.view_horizontal_scroll);

                        if (scrollView != null) {
                            int currentItem = getCurrentPagerItem();
                            if (_id < currentItem) {
                                // previous Item
                                View content = scrollView.getChildAt(0);
                                int width = content.getWidth();
                                width = width - scrollView.getWidth();
                                scrollView.scrollTo(width, 0);
                            } else if (_id > currentItem) {
                                // next Item
                                scrollView.scrollTo(0, 0);
                            } else {
                                // current Item
                            }

                        }
                    }
                });

    }
于 2012-05-07T09:33:40.223 に答える