我从我的应用程序的一些用户那里得到一个错误,当从我的 MainActivity 中单击一个 listItem 时,他们会将他们带到 DetailActivity(这是期望的结果),但是如果他们按返回或向上,他们会看到一个 MainActivity复制了所有内容(listView、menuItems)。有人建议可能是因为内存导致 Activity 被终止,所以我进入手机上的开发人员选项并打开“不保留 Activity ”。这使我能够复制问题。现在我必须弄清楚为什么一切都是重复的,但我对进入哪个方向有点困惑。这不像是在我的 onResume() 中创建菜单和布局。我在 onCreate() 中做所有事情。有没有人对从未保留的 Activity 中优雅地恢复有任何建议?
编辑 1:
回应@Tomer Mor 的评论
我总共有三个 Activity 。 A -> B-> C
在这种情况下,MainActivity 是 B,DetailActivity 是 C。我的 Activity A 是一个“LoginActivity”,在我成功“登录”后得到 finish()。
编辑 2:
如果有帮助,我的 MainActivity 是一个 FragmentActivity。
编辑 3:
回应@Doctoror Drive。我的 MainActivity 扩展了 FragmentActivity。 MainActivity 添加 MyFragment.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setUpActionBar();
Toast.makeText(this, this.getClass().getSimpleName(), 1).show();
setContentView(R.layout.my_placement);
myFragment = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_container, myFragment);
fragmentTransaction.commit();
}
我在 MainActivity extends FragmentActivity
的 onCreate 中放置了一个日志,它被称为 ONCE。 我放置了一个 Log.d()
在我的 MyFragment.java
的 onCreateOptionsMenu()
中它显示了 TWICE! 所以它被调用了两次,但我不确定如何如果它只被创建一次。
编辑 4:
03-24 14:17:37.038: E/MainActivity(26486): onCreate hit!
03-24 14:17:37.048: D/SherlockFragmentActivity(26486): [supportInvalidateOptionsMenu]
03-24 14:17:37.048: D/SherlockFragmentActivity(26486): [invalidateOptionsMenu]
03-24 14:17:37.048: D/ActionBarSherlock(26486): [dispatchInvalidateOptionsMenu]
03-24 14:17:37.048: E/MyFragment(26486): onActivityCreated!
03-24 14:17:37.048: D/SherlockFragmentActivity(26486): [supportInvalidateOptionsMenu]
03-24 14:17:37.048: D/SherlockFragmentActivity(26486): [invalidateOptionsMenu]
03-24 14:17:37.048: D/ActionBarSherlock(26486): [dispatchInvalidateOptionsMenu]
03-24 14:17:37.048: E/MyFragment(26486): onActivityCreated!
编辑 5:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
savedInstanceState=null;
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
adapter = AnimalList.getAnimalAdapter();
setListAdapter(adapter);
}
最佳答案
在 Activity 恢复其状态时添加 Fragment 是一个常见错误。 您应该仅在 Activity 的 savedInstanceState 为 null 时添加 Fragment,否则 FragmentManager 会自动为您添加它,您最终会附加两个 fragment 实例。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
if (savedInstanceState == null) {
final FragmentManager fragmentManager = getSupportFragmentManager();
final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_container, myFragment);
fragmentTransaction.commit();
}
}
另一个不好的做法是使用成员来访问 fragment 。 Fragment 的生命周期可能与 Activity 略有不同,因此 myFragment 成员在某些时候可以指向过时的 Fragment 实例。 正确的方法是每当你需要 MyFragment 时,在 FragmentManager 中找到它
//if you need to do something with MyFragment
public void doSomething() {
final MyFragment myFragment = getMyFragment();
// can be null if re-creating or not yet attached.
if (myFragment != null) {
myFragment.doSomething();
}
}
private MyFragment getMyFragment() {
return (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
}
关于java - Android - 在 Android 开发者选项中打开 "Don' t keep activities 会复制我的 FragmentActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22615555/