我认为这个问题被多次提出,但没有其他问题以某种方式回答我的问题。问题很简单。我有片段活动
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,但都徒劳无功。
答案 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。"
因此,当你的活动没有从内存中释放时,它的状态改变的唯一方法是,如果其中一种方法正在改变它 - 它们可能是无意中做的,通过用初始化值覆盖当前状态。
如果新活动实际上正在破坏您的活动,那么娱乐活动就是" 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>
。