我的 android 应用程序中有这个导航模式:
PrimaryActivity (... ListView onClick -通过意图发送<PrimaryUri>
...) > MasterActivity (TabLayout, ViewPager, FragmentPageAdapter) >
FragmentA / FragmentB (...ListView onClick - 通过意图发送<PrimaryUri> + <DetailUri> .. .) > 详细活动。
现在,当我在DetailActivity中按下 BACK 按钮时,MasterActivity 被销毁并使用 Fragment A 和 B 的新实例重新创建,并且 Intent 数据 ( <PrimaryUri> ) 丢失。
我尝试通过这种方式在 Activies 之间保持<PrimaryUri> :
- 在 MasterActivity 中覆盖 onSaveInstanceState / onCreate(Bundle),但即使 onSaveInstance 保存数据, Bundle 也始终为空
- 使用 getActivity().startActivityForResult(... 启动 DetailActivity,在 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);
}
在 FragmentB 我有:
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.onDestroy 被调用(为什么在那里?).. =
- 对 FragmentB 的 WeakReference 为 null 并创建了新实例 =
- MasterActivity 或 FragmentB 的 onActivityResult 永远不会被调用。
我认为原因是在等待 onActivityResult 时出现了 onDestroy。但是为什么调用它以及为什么没有完全重新创建 MasterActivity 以捕获 onActivityResult 回调?