android - 这是以编程方式调用 fragment 的正确方法吗?

标签 android android-fragments

我的代码:

public class MainActivity extends AppCompatActivity {
    private FragmentA fragmentA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            fragmentA = FragmentA.newInstance();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A");
            fragmentTransaction.commit();
        }
        else {
            fragmentA = (FragmentA) getSupportFragmentManager().findFragmentByTag("FRAGMENT_A");
        }
    }

}

我真的不知道我在做什么,但这就是我目前所做的。我为 Fragment 定义了一个容器,然后使用 FragmentTransaction 将其替换为 Fragment。不过,我感到困惑的部分是 else 语句。

  1. 我应该以不同的方式构建它吗?

  2. 我认为配置更改消除了 Activity 和 Fragment,那么为什么要在某些支持管理器中检查 Fragment?这是否意味着 Fragments 实际上不会被销毁?同时,它们似乎确实被破坏了,因为它们似乎会重置,除非我使用 onSaveInstanceStategetArguments() 方法。

编辑:这样做有什么问题:

public class MainActivity extends AppCompatActivity {
    private FragmentA fragmentA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fragmentA = FragmentA.newInstance();
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A");
        fragmentTransaction.commit();
    }

}

最佳答案

在本例中,SupportFragmentManager 会在配置更改时为您销毁和重新创建它们。

回答您的问题:

  1. Should I be structuring this differently?

不,如果没有已保存状态,这正是您应该创建 fragment 并在有状态时检索它们的方式。另见我的回答 here ;

  1. a) so why check for the Fragment in some support manager?

因为管理器会在配置更改时为您处理 fragment 的生命周期。

  1. b) Does this mean Fragments don't actually get destroyed?

不,它确实被摧毁了。看这个diagram供引用。

编辑以回答评论中的一些问题:

But any member variables inside that Fragment are completely lost on configuration change unless I save them in that Fragment's onSaveInstanceState, right?

没错。因为您的 fragment 正在被销毁,所有未保存在 onSaveInstanceState 上的内容都会丢失。

So then what exactly am I restoring?

你没有恢复任何东西。您只是检索对先前创建的 fragment 的引用。您在 fragment 的 onRestoreInstanceState() 方法上恢复变量。

What's wrong with doing this (the code from the edit in the question)?

如果您这样做,您将向 R.id.fragment_a_container 容器中添加一个新的 fragment 实例。因此,旧 fragment 将与您保存在 onSaveInstanceState() 中的状态一起丢失。这将是一个新 fragment ,其中包含新信息并且事件 onRestoreInstanceState() 不会 被调用。

关于android - 这是以编程方式调用 fragment 的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39925934/

相关文章:

Android runOnUiThread/AsyncTask 无法解析 CalledFromWrongThreadException

android - Fabric/Crashlytics Android 为 Apikey 添加字符串资源导致 Crashlytics 开发者工具错误

java - 如何在android表格中添加行

android - CoordinatorLayout + ActionBar + fragment

android - 在自定义 DialogFragment 中找不到 fragment ID 的 View

android - 如何从 Android 中的 Activity 访问自定义适配器内 fragment 的 UI 元素

android - GoogleAccountCredential-[错误]名称不能为空: null - despite permissions

android - @media 查询如何工作?

android - 使用兼容包 android 膨胀 fragment

android - 在方向改变时切换 fragment 或 Activity (即布局)