我从我的应用程序的几个用户那里得到一个错误,当我从MainActivity点击listItem时会将它们带到DetailActivity(这是所需的结果),但如果他们按下或向上按,他们会看到一个MainActivity那些东西都重复了(listView,menuItems)。有人建议可能因内存而导致活动被杀死所以我在手机上进入开发者选项并打开“不要保持活动”。这让我可以复制这个问题。现在我必须弄清楚为什么一切都是重复的,但我有点陷入了进入的方向。这不像我在onResume()中创建菜单和布局。我在onCreate()中做了一切。有没有人对从未保存的活动中优雅地恢复有任何建议?
编辑1:
回应@Tomer Mor的评论
我总共有三项活动。 A - > B-> ç
这种情况下的MainActivity是B,DetailActivity是C.我的活动A是“LoginActivity”,在我成功“登录”后得到完成()'。
编辑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()
的{{1}} onCreateOptionsMenu()
中添加MyFragment.java
它显示 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);
}
答案 0 :(得分:2)
在Activity恢复状态时添加片段是一个常见的错误。 只有当Activity的savedInstanceState为null时,才应添加Fragment,否则FragmentManager会自动为你添加它,最后会附加两个片段实例。
@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();
}
}
另一个不好的做法是使用成员访问Fragments。 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);
}