0

在我的应用程序中有一个带有 3 个片段的 viewpager。
在其中一个片段中,我开始了另一项活动。
我希望用户回到他之前在备份/备份时所在的同一查看页面。

onPause我使用托管 viewpager和onResume方法的活动成功实现了它。它有效,但问题是onResume在 之后被触发onCreate,这导致应用程序从同一页面开始(而不是“默认”,我在onCreate方法中设置的不同页面)。

然后我尝试将onResume代码放在启动活动的onOptionsItemSelected方法中,但这根本不起作用。

开展活动:

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);
}

主要活动:(托管viewpager)

public void onPause() {
    super.onPause();

    vpPref = getPreferences(MODE_PRIVATE);
    vpPrefEditor = vpPref.edit();
    vpPrefEditor.putInt("viewPagerPage", mPager.getCurrentItem());

    vpPrefEditor.commit();
}

问题出在第一个代码中。我不知道这是放置问题还是错误的实例MainActivity是错误的...

这种行为的原因可能是什么?

4

1 回答 1

1

ViewPager这是访问from的一种不好的方式MainActivity(我希望MainActivity.instance不是一个包含对MainActivity实例的引用的静态字段)。您应该让MainActivity完全处理ViewPager' 的位置:

在其中onPause()MainActivity您将保留当前代码。在您的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。这样,如果MainActivity启动,您将保留默认页面(shouldRestore将是 false,因为已启动的活动尚未运行)。如果在MainActivity您进入启动的活动shouldRestore后将变为true(您需要将其设置在 中onCreate),并且当您返回时,ViewPager将设置到 中的正确页面onResume()

这留下了一种情况,用户可以转到已启动的活动(这shouldRestore将是真的)但永远不会MainActivity返回返回。为此,您可以从Intent开始测试类别MainActivity(我假设它是清单中提到的作为启动器活动的类别):

Set<String> catg = getIntent().getCategories();
for (String cat : catg) {
     if (cat.equals(Intent.CATEGORY_LAUNCHER)) {
        // reset the shouldRestore flag to false so we end up with the default page 
        break;
     }
}
于 2013-08-11T18:29:11.133 回答