Android导航,从片段活动再回来

时间:2016-01-15 09:52:05

标签: android android-fragments

我认为这个问题被多次提出,但没有其他问题以某种方式回答我的问题。问题很简单。我有片段活动

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_tabbed);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }
private void setupViewPager(ViewPager viewPager) {
        adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new Fragment1(), "1");
        adapter.addFragment(new Fragment2(), "2");
        adapter.addFragment(new Fragment3(), "3");
        viewPager.setAdapter(adapter);
    }

到目前为止一切顺利,我可以导航到片段2,在那里我可以开始新的活动

Intent intent = new Intent(activity, AnotherActivity.class);
startActivity(intent);

然后,当我完成这个动作的内容时,可以使用后退按钮返回我的活动片段。但是,它始终以fragment1而不是fragment2开始,这是我开始厌恶的那个。如何让fragment2处于活动状态时返回原始状态?

我尝试过onSaveStateInstance和PendingActivity,但都徒劳无功。

3 个答案:

答案 0 :(得分:1)

只需执行以下操作,在onStop状态下保存当前位置和onStart状态更改ViewPager项目位置。

  int selectedPosition=0;

    @Override
    public void onStart(){
        super.onStart();
        viewPager.setCurrentItem(selectedPosition);
    }

    @Override
    public void onStop(){
        super.onStop();
        selectedPosition=viewPager.getCurrentItem();
    }

答案 1 :(得分:1)

如果新活动仅将您当前的活动置于暂停或已停止状态,则娱乐活动将从" onResume"或" onStart"方法分别。在这种情况下,所有内容都保留在内存中,并且未在" onPause"中明确释放。或者" onStopped。"

  • onPause - 如果第二个活动仅部分覆盖,则调用。
  • onStop - 如果第二个活动完全覆盖,则调用。

因此,当你的活动没有从内存中释放时,它的状态改变的唯一方法是,如果其中一种方法正在改变它 - 它们可能是无意中做的,通过用初始化值覆盖当前状态。

如果新活动实际上正在破坏您的活动,那么娱乐活动就是" onCreate"并且活动没有保留在记忆中。相反,正如您所知,onSaveInstance方法已被调用,默认实现会写入有关ViewHiearchy的数据。

此ViewHiearchy数据包括ViewPager和有关片段的信息。 onCreate中的super方法将创建新的片段实例并附加它们,因此您应该尝试并查看它是否提供了所需的结果。

目前,您正在覆盖onCreate使用onSaveInstance捆绑包进行恢复的尝试,因为您在每次调用时都设置了默认初始化。您应该尝试通过检查非空包并跳过默认初始化来实现它,如开发人员指南中所示。 (见http://developer.android.com/training/basics/activity-lifecycle/recreating.html):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

另请查看第二个答案如何恢复onCreate中ViewPager的状态: ViewPager and fragments — what's the right way to store fragment's state?

答案 2 :(得分:0)

  

如何让它返回到fragment2 active

的原始状态

使用intent.putExtra();传递要显示的片段的位置,然后在被调用的Activity中使用setCurrentItem(position); ViewPager Fragment 1}}然后将显示特定的<div class="row"> <div class="col-sm-4"> <h3>Send Feedback</h3> <form data-bind="submit: sendFeedback"> <div class="form-group"> <label>Feedback</label> <textarea class="form-control" data-bind="value: feedbackText"></textarea> </div> <div class="form-group"> <label>Version Id</label> <input class="form-control" type="text" data-bind="value: versionId" /> </div> <div class="form-group"> <label>Image</label> <input class="form-control" type="file" data-bind="file: {data: fileInput, name: fileName, reader: someReader}" /> </div> <div class="form-group"> <button type="submit" class="btn btn-default">Submit</button> </div> </form> </div>