保存ViewPager当前页面的编号

时间:2014-03-17 22:37:48

标签: android android-viewpager

我有ViewPager FragmentStatePagerAdapter,起始页应位于中间位置。但是当用户转到另一个Activity然后返回时,应该保存页码,以便他返回到同一页面。可能有一种简单的方法可以完成这项工作,但我找不到解决方案。

通常会保存当前页码,所以这不是重点。问题是我不知道在哪里放置设置起始页面的代码,因为当我把它放在onCreate时,即使我从返回,也会显示起始页面不同 Activity

我也尝试在onPause方法中保存变量中的数字:

this.currentPageNumber = viewPager.getCurrentItem();

但下次调用onStart()时,变量currentPageNumbernull,因此似乎onDestroy()之后的变量未保存。

我可以使用静态变量,但感觉不对。有更好的解决方案吗?

编辑:抱歉,我没有说清楚,我想要保存的页面只能打开,如果我在启动它之后回到此活动。每次从启动器启动Activity时,都应显示起始页面,而不是已保存的页面。

编辑2 :我想要的行为与Google日历应用在打开日期或周视角时的行为完全相同。如果我打开此应用程序,将显示当天。如果我滑到另一天,然后打开设置,然后按回来,这一天仍然显示。但如果我重新启动应用程序,今天将再次显示。

3 个答案:

答案 0 :(得分:2)

初始化viewpager后,请使用以下方法:

viewPager.setCurrentItem(int position)

或者这个:

viewPager.setCurrentItem(int position, boolean withAnimation)

您可以使用SharedPreference方法中的onPageSelect()保存最后一个位置,您可以在其中获取每个页面的位置。您必须实现OnPageChangeListner才能使用此方法。

修改

你的问题不清楚:

  

抱歉,也许我没有充分表达我的问题。我希望每次启动应用程序时都会显示起始页面。但是如果我通过后退按钮输入活动(例如,如果我打开我的设置活动然后返回),则应显示最后查看的页面。每次打开应用程序时,链接中提供的解决方案都将导致安全页面

我不知道你为什么要改变它,这是一种正常行为,请阅读this。 但是,如果您坚持,则可以始终在setCurrentItem()的{​​{1}}中使用onResume方法,因此在Activity/Fragment恢复后,第一页将始终显示。

修改2

这仍然可以由Activity/Fragment完成。在适配器中,尝试检测setCurrentItem的{​​{1}}的{​​{1}}。创建一个从适配器外部返回该字段的方法。然后在初始化index之后

page

适配器中的方法:

current day

答案 1 :(得分:1)

每当调用onCreate主机ViewPager的{​​{1}}并显示当前<时,我都要求显示默认页面所有其他案例的/ em>页面,包括激励案例:当用户从当前页面开始的Activity导航回来时(在这种情况下将不会调用Activity)。我的解决方案基于onCreateonCreate之间的时间花费。

如果onResumeonCreate之间的时间较短,那么阈值(我使用1s假定onResume可以在1s内完成,这是我们真正想要的良好编程习惯),然后我们认为这是第一次在onCreate之后立即调用onStart / onResume,否则我们认为这是关于所有其他情况,包括我们的激励案例。

然后我们只需要在onCreate中设置当前时间戳,并在onCreate中进行时间比较,以便决定将onResume的当前项设置为默认值< / em>或当前。请注意,我们需要将ViewPager中的当前页码保存在onPause

我并不是说这个想法很完美,但到目前为止我的工作正常。如果您对实施感兴趣,请告诉我,我会根据您的要求发布我的代码。

答案 2 :(得分:0)

我认为这可以解决您的问题,因为您第一次启动活动时没有保存实例(savedInstanceState)... 阅读帖子中的评论... Android :Save View Pager State ...