1

我想創建一個水平滾動ViewPager。 我的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。到現在爲止還挺好。水平滾動工作正常。

但現在我有一個問題:

比方說,我有一個ViewPager與,([0],[1],[2],[3],[4])在它5個片段並希望從項目[2]開始。當我siwpe向後我想,以前的項目[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.

有沒有人知道答案? 謝謝!

回答

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 
          } 

         } 
        } 
       }); 

    } 
+0

_id是未申報的,請告訴我什麼是ID值; –