我的android应用程序中有这样的导航模式:
PrimaryActivity(…ListView onClick-通过发送<PrimaryUri>意图…)>
MasterActivity(TabLayout、ViewPager、,FragmentPageAdapter)>
FragmentA/FragmentB(…ListView on Click-发送<PrimaryUri>+<DetailUri>通过意向…)>详细活动。
现在,当我按下DetailActivity中的BACK按钮时,MasterActivity将被销毁,并使用片段A和B的新实例重新创建,Intent数据(<PrimaryUri>)将丢失。
我试着坚持<PrimaryUri>通过这种方式在活动之间:
- 覆盖MasterActivity中的onSaveInstanceState/onCreate(Bundle),但Bundle始终为null即使onSaveInstance保存数据
- 使用getActivity()启动DetailActivity。startActivityForResult(…,在DetailActivity中设置resultIntent并调用setResult(OK,ResultCode>0)并读取MasterActivity.onActivityResult中的值…但是从未调用onActivityResult
- 使用startActivityForResult启动DetailActivity。。。dtto。。。FragmentB.onActivityResult…但是onActivityResult从来都不是已调用
- 已检查清单中的错误属性
现在,我真的很感谢帮助解决这个问题:如何坚持<PrimaryUri>在我的申请中?我更喜欢使用意图来解决这种奇怪的行为。一些论坛讨论了FragmentPageAdapter等中的错误。如果这是一个快速的解决方案,也许我会重构它以使用SharedPreferences。。。
编辑:一些附加信息:
详细活动:
@Override
public void finish() {
Intent resultIntent = new Intent();
resultIntent.setData((Uri) getIntent().getParcelableExtra(FragmentB.MY_URI));
setResult(Activity.RESULT_OK, resultIntent);
super.finish();
}
在MasterActivity中我有:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
在碎片B中我有:
public void onItemSelected(Uri contentUri) {
Intent intent = new Intent(getActivity(), DetailActivity.class);
intent.putExtra(PRIMARY_URI, mUri);...
startActivityForResult(intent, FragmentB.BACKTAG);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case (FragmentB.BACKTAG): {
if (resultCode == Activity.RESULT_OK) {
mUri = data.get...
}
}
break;
}
}
奇怪的行为看起来像:
- 我按下DetailActivity>中的BACK按钮
- MasterActivity.尝试被呼叫(为什么会这样?)=
- 对FragmentB的WeakReference为空,并且创建了新实例=
- 永远不会调用MasterActivity或FragmentB的onActivityResult
我认为原因是在等待onActivityResult时出现了onDestroy。但是,为什么要调用它,为什么MasterActivity没有完全重新创建以捕获ActivityResult回调?
这很头疼,但经过两天的徒劳尝试,我找到了解决方案。这与FragmentPageAdapter无关。我是个幸运的女人!
您在片段中调用startActivityForResult是吗?
对于要调用的片段中的onActivityResult,您首先必须在活动中处理onActivityResult。打电话给上级。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
然后,您应该能够在片段的onActivityResult中处理它。