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.
有沒有人知道答案? 謝謝!
_id是未申報的,請告訴我什麼是ID值; –