【发布时间】:2015-09-24 16:48:00
【问题描述】:
我正在开发一个应用程序,目前我正在尝试将ScreenSlide 添加到它。我设法使用tutorial 做到了这一点,但x 页面之间的通常滑动并不是我想要的。
使用下面提供的代码,我可以在 5 页之间滑动,但页面对齐成一条直线,您不能从第一页直接转到第 5 页,反之亦然。 在我的应用程序中,我有 4 页。当我向左滑动时,我在前两页之间切换,当我向右滑动时,我在最后两页之间切换。在下图中,您可以看到我当前的代码如何切换页面及其下方 - 我的目标。
public class MainActivity extends FragmentActivity {
private static final int NUM_PAGES = 5;
private ViewPager mPager;
private ScreenSlidePageFragment[] pages = new ScreenSlidePageFragment[NUM_PAGES];
private PagerAdapter mPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_slide);
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
}
@Override
public void onBackPressed() {
if (mPager.getCurrentItem() == 0) {
super.onBackPressed();
} else {
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_PAGES;
}
@Override
public Fragment getItem(int position) {
boolean moveRight = mPager.getCurrentItem() < position;
boolean moveLeft = mPager.getCurrentItem() > position;
switch(position){
case 5:
if(moveRight){
return geLog.w("i"
+ "Info", Integer.toString(position));
//return getPageByPosition(2);
if(moveLeft)
return getPageByPosition(2);
}
return new ScreenSlidePageFragment();
}
private Fragment getPageByPosition(int position){
int index = position - 1;
if(index < 0 || index > NUM_PAGES-1)
throw new InvalidParameterException("requested position is invalid");
if(pages[index] == null)
pages[index] = new ScreenSlidePageFragment();
return pages[index];
}
}
}
[更新]
我已经编写了一个代码,可以让我在 6 个不同的页面之间无限向右滑动。左侧是有限的——我只能滑动到第一页(所以如果我在向右循环 3 次后在第一页,我只能向后循环 3 个循环)。我想我非常接近找到解决方案。有什么想法吗?
MainActivity.java
public class MainActivity extends FragmentActivity {
private static final int NUM_PAGES = 6;
private ViewPager pager;
private PagerAdapter pagerAdapter;
private List<ScreenSlidePageFragment> slideList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
slideList = new ArrayList<ScreenSlidePageFragment>();
for (int i = 0; i<NUM_PAGES; i++){
ScreenSlidePageFragment slide = new ScreenSlidePageFragment();
slide.setIndex(i+1);
slideList.add(slide);
}
pager = (ViewPager) findViewById(R.id.pager);
pagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
pager.setAdapter(pagerAdapter);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
int _pos = position % NUM_PAGES;
return slideList.get(_pos);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
}
}
ScreenSlidePageFragment.java
public class ScreenSlidePageFragment extends Fragment {
private int index;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup)inflater.inflate(R.layout.slide, container, false);
TextView tw = (TextView) root.findViewById(R.id.textView);
tw.setText(Integer.toString(index));
return root;
}
public void setIndex(int index){
this.index = index;
}
}
【问题讨论】:
-
就页面持久性和用户体验而言,这是一个令人困惑的流程,我强烈建议您重新考虑您的导航设计。话虽如此,您可能需要自己进行动画和手势识别,而不是使用寻呼机适配器。否则,您将需要在每次页面更改后修改寻呼机适配器。 developer.android.com/reference/android/support/v4/app/…
-
我给你 +1 的绘图 :-)
-
覆盖每个片段中的
onBackPressed();像这样的东西?onBackPressed() { getViewPager().setSelectedItem(0); } -
这不是您要找的吗? github.com/antonyt/InfiniteViewPager
标签: java android android-fragments android-fragmentactivity