Java 在碎片之间滑动
我正在开发一个应用程序,目前我正在尝试将Java 在碎片之间滑动,java,android,android-fragments,android-fragmentactivity,Java,Android,Android Fragments,Android Fragmentactivity,我正在开发一个应用程序,目前我正在尝试将屏幕幻灯片添加到其中。我使用了一个,但通常在x页面之间滑动并不是我想要的 使用下面提供的代码,我可以在5页之间滑动,但页面对齐成直线,不能从第一页直接到第五页,反之亦然。 在我的应用程序中,我有4个页面。当我向左滑动时,我在前两页之间切换,当我向右滑动时,我在最后两页之间切换。在下面的图片中,你们可以看到我当前的代码是如何切换页面和页面下的——我的目标 一个可能的解决方法是不使用viewpager,而是创建您自己的自定义滑块,我最终使用了这个解决方案,因
屏幕幻灯片
添加到其中。我使用了一个,但通常在x
页面之间滑动并不是我想要的
使用下面提供的代码,我可以在5页之间滑动,但页面对齐成直线,不能从第一页直接到第五页,反之亦然。
在我的应用程序中,我有4个页面。当我向左滑动时,我在前两页之间切换,当我向右滑动时,我在最后两页之间切换。在下面的图片中,你们可以看到我当前的代码是如何切换页面和页面下的——我的目标
一个可能的解决方法是不使用viewpager,而是创建您自己的自定义滑块,我最终使用了这个解决方案,因为viewpager非常不灵活,例如,如果您尝试做类似Facebook页面应用之类的事情。 缺点:你必须管理所有的接触和生命周期 另一个简单的解决方案是基本上使用下面的API,如果我正确理解了这个问题,它应该足够了。
ViewPager.setCurrentItem
这就是我要做的
由于屏幕数量有限,我会制作一个数组,将您制作的ScreenSlidePageFragment
的每个实例保存在相应的索引下。因此,您可以使用“位置”从该数组中获取实例。这将允许您利用getItem
函数执行以下操作
...
private ScreenSlidePageFragment[] pages = new ScreenSlidePageFragment[NUM_PAGES];
...
@Override
public Fragment getItem(int position) {
boolean moveRight = mPager.getCurrentItem() < position;
switch(position){
case 1:
if(moveRight)
return getPageByPosition(3);
return getPageByPosition(2);
case 2:
if(moveRight)
//case when you are in a position 3 and swipe right - return first screen
return getPageByPosition(3);
//if you're swiping left from position 1, return the next screen
return getPageByPosition(1);
case 3:
//write out the rest of your logic
...
}
}
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];
}
。。。
私有ScreenSlidePageFragment[]页=新ScreenSlidePageFragment[NUM_页];
...
@凌驾
公共片段getItem(int位置){
布尔moveRight=mPager.getCurrentItem()页数-1)
抛出新的InvalidParameterException(“请求的位置无效”)
如果(页面[索引]==null)
pages[index]=新建ScreenSlidePageFragment();
返回页[索引];
}
注意:代码未测试
基本上,您需要根据您当前所在的位置和请求的位置写出逻辑以返回片段的现有实例。我认为这是可能的。 1.将ViewPager的项目计数设置为Integer.MAX_值,将当前项目设置为Integer.MAX_值/2。它让你能够创建一个虚假的无限卷轴。 2.根据当前位置上的片段实现您的逻辑。如果将它们存储在适配器中,则很容易:
@Override
public Fragment getItem(int position) {
ItemFragmentRoot fragment = new ItemFragmentRoot();
mFragmentMap.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
mFragmentMap.remove(position);
}
public ItemFragmentRoot getItem(int position){
return mFragmentMap.get(position);
}
viewPager.setCurrentItem(PAGE_POS);
如果要导航到页面而不平滑滚动
viewPager.setCurrentItem(PAGE_POS,false);
在页面持久性和用户体验方面,这是一个令人困惑的流程,我强烈建议您重新考虑导航设计。也就是说,你可能需要自己做动画和手势识别,而不是使用寻呼机适配器。否则,您需要在每次页面更改后修改寻呼机适配器。我给了你+1的绘图:-)在每个片段中覆盖
onBackPressed()
;也许是这样的onBackPressed(){getViewPager().setSelectedItem(0);}
这不是您要找的吗?我已经实现了你的代码,但它不起作用。我简化了这个过程,因此我得到的问题和测试更少,如果我在第五页向右滑动,是否可以进入第一页-没有成功。我已经更新了代码,你调试了吗?当position
为5
时,返回哪个片段?我还想知道,既然没有将任何内容传递到片段实例中,您如何辨别哪个片段是哪个片段。如果有一些UI可以使其看起来不同,那么您可能还需要检查代码以确保正确保存/恢复片段状态,因为片段在视图中进出时应该执行onPause
和onResume
。I added Log.w这会在我每次向右滑动手指时给我一条消息指定的页面(查看更新的代码)。当我使用案例4时,它会给我一个日志
,但它不适用于案例5。虽然显示了日志,但它不会将我转移到第一页。到目前为止,我不需要查看片段上的内容-我只查看转换本身。请看这里,我认为它会有所帮助
@Override
public Fragment getItem(int position) {
ItemFragmentRoot fragment = new ItemFragmentRoot();
mFragmentMap.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
mFragmentMap.remove(position);
}
public ItemFragmentRoot getItem(int position){
return mFragmentMap.get(position);
}
viewPager.setCurrentItem(PAGE_POS);
viewPager.setCurrentItem(PAGE_POS,false);