在我的应用中,有一个包含3个片段的viewpager 在其中一个片段中,我正在开始另一项活动 我希望用户返回到之前/之后他所在的同一个viewpager页面。
我使用托管viewpager的onPause
和onResume
方法的活动成功实现了它。它工作但问题是onResume
在onCreate
之后被解雇,这导致应用程序从同一页面开始(而不是“默认”,我在{{1}中设置的不同页面方法)。
然后我尝试将onCreate
代码放在启动活动的onResume
方法中,但这根本不起作用。
推出活动:
onOptionsItemSelected
主要活动:(托管viewpager)
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
vpPref = getPreferences(MODE_PRIVATE);
int value = vpPref.getInt("viewPagerPage", -1);
if (value != -1) {
MainActivity.instance.mPager.setCurrentItem(value);
vpPrefEditor = vpPref.edit();
vpPrefEditor.remove("viewPagerPage");
vpPrefEditor.commit();
}
return true;
}
return super.onOptionsItemSelected(item);
}
问题在于第一个代码。我不知道这是一个放置问题还是错误的public void onPause() {
super.onPause();
vpPref = getPreferences(MODE_PRIVATE);
vpPrefEditor = vpPref.edit();
vpPrefEditor.putInt("viewPagerPage", mPager.getCurrentItem());
vpPrefEditor.commit();
}
实例错误...
导致此行为的原因是什么?
答案 0 :(得分:1)
从ViewPager
访问MainActivity
这是一种不好的方法(我希望MainActivity.instance
不是一个持有对MainActivity
实例的引用的静态字段)。您应该让MainActivity
完全处理ViewPager
的位置:
在onPause()
的{{1}}中,您将保留当前代码。在MainActivity
的{{1}}方法中,您将拥有:
onResume()
MainActivity
首选项将根据@Override
public void onResume() {
super.onResume();
vpPref = getPreferences(MODE_PRIVATE);
final int value = vpPref.getInt("viewPagerPage");
final boolean shouldRestore = vp.getboolean("restoreStatusFlag");
// we are again in the MainActivity so also make
// restoreStatusFlag as false in the preferences
if (shouldRestore) {
mPager.setCurrentItem(value);
}
}
中已启动的活动进行设置。这样,如果启动shouldRestore
,您将保留默认页面(onCreate
将为false,因为已启动的活动尚未运行)。如果在MainActivity
之后您转到已启动的活动shouldRestore
将成为MainActivity
(您需要在shouldRestore
中设置)并在您返回时true
将设置为onCreate
中的右侧页面。
这留下一个用户可以进入已启动活动的场景(ViewPager
将为真),但永远不会带回BACK onResume()
。为此,您可以从shouldRestore
开始MainActivity
(我假设清单中提到的那个作为启动器活动)测试类别:
Intent