1

Я хочу создать горизонтальный прокручиваемый ViewPager. My 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 с 5 фрагментов ([0], [1], [2], [3], [4]) в ней и хотите начать с пункта [2]. Когда я siwpe назад Я хочу, чтобы положение прокрутки предыдущего пункта [1] находится на праве максимума, а не 0.

My 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 является необъявленная, пожалуйста скажите мне, что значения идентификаторов; –

Смежные вопросы