Android 从ViewPager启动新活动并返回到同一页面

Android 从ViewPager启动新活动并返回到同一页面,android,android-fragments,android-activity,android-viewpager,Android,Android Fragments,Android Activity,Android Viewpager,在我的应用程序中,有一个viewpager,其中包含3个片段。 在其中一个片段中,我开始另一个活动。 我希望用户返回到之前备份/备份时所处的同一个viewpager页面 我使用承载viewpager的onPause和onResume方法的活动成功地实现了它。它起作用了,但问题是onResume在onCreate之后被触发,这导致应用程序在同一页面启动(而不是在onCreate方法中设置的“默认”页面) 然后我尝试将onResume代码放在启动活动的onOptionsItemSelected方法中

在我的应用程序中,有一个viewpager,其中包含3个片段。
在其中一个片段中,我开始另一个活动。
我希望用户返回到之前备份/备份时所处的同一个viewpager页面

我使用承载viewpager的
onPause
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)

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


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

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

main活动的
onPause()
中,您将保留当前代码。在
main活动的
onResume()
方法中,您将有:

@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,因为启动的活动尚未运行)。如果在
main活动
之后转到启动的活动,则
shouldRestore
将变为
true
(您需要在
onCreate
中进行设置),当您返回时,
查看页面
将在
onResume()中设置到右侧页面

这就留下了这样一个场景,用户可以转到已启动的活动(
shouldRestore
将为true),但不会返回到
MainActivity
。为此,您可以从启动
MainActivity
Intent
中测试该类别(我假设它是清单中提到的启动器活动):

Set catg=getIntent().getCategories();
用于(字符串类别:catg){
if(类别等同(意图类别_发射器)){
//将shouldRestore标志重置为false,这样我们就得到了默认页面
打破
}
}

很抱歉回复太晚-非常感谢!顺便问一下,有没有其他更好的方法来访问
MainActivity
的实例?或者这根本不是一个好的做法?我知道可以在片段内部使用
getActivity()
,广播者/接收者可以进行不同的活动。@xTCx是从外部访问MainActivity的更好方法(像其他活动一样?)。如果是,则应避免这种情况,因为一旦
活动
调用
onPause()
,该活动可能会被系统终止,因此尝试在另一个活动中访问它会带来问题。
@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);  
    }
}
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;
     }
}