java - Android - 在 Android 开发者选项中打开 "Don' t keep activities 会复制我的 FragmentActivity

标签 java android android-layout android-listview android-activity

我从我的应用程序的一些用户那里得到一个错误,当从我的 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.javaonCreateOptionsMenu() 中它显示了 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/

相关文章:

java - 单线程执行的性能调优

android - 如何在操作栏溢出菜单中对齐菜单项文本

android - 如何在baseAdapter中使用onclick按钮

java - 如何计算包含一个数字但不包含另一个数字的数字?

java - java.net.URL 中 -1 端口值的含义?

java - 捕获图像在 HTC 设备上崩溃

java - 在不发布更新的情况下更改 PlayStore 中的新功能部分

java - 使用 Volley 发送数据

android - 按 ID 或 TAG 查找按钮

java - 将 PinField.getPassword() 的输出转换为字符串