android – 删除片段然后重新添加它

我在我的活动中编写了一个方法setLoading,负责设置我的应用程序的“加载”状态.此方法负责实例化一个LoadingFragment,删除它的任何现有实例(使用FragmentManager),然后根据它的第一个参数加载,将其添加到两个可能的容器之一(取决于top参数).

protected LoadingFragment loadingFragment;

public void setLoading(boolean loading, boolean top) {
    FragmentManager fragmentManager = getFragmentManager();

    // Create LoadingFragment instance if it has not already been created
    if (loadingFragment == null || !(loadingFragment instanceof LoadingFragment)) {
        loadingFragment = new LoadingFragment();
    }

    // Remove the fragment first if it is present
    fragmentManager
            .beginTransaction()
            .remove(loadingFragment)
            .commit();

    // Only if loading is true should we display the fragment
    if (loading) {
        // Decide which container we're going to put the fragment in
        int id = top ? R.id.topContainer : R.id.container;

        // Place the fragment in the right position
        fragmentManager
                .beginTransaction()
                .add(id, loadingFragment)
                .commit();
    }
}

public void setLoading(boolean loading) {
    setLoading(loading, true);
}

我从我的活动中的其他地方触发setLoading(true),并且在测试时我已经注释掉了相应的setLoading(false).

我想要发生的是每次调用setLoading(true)时我的LoadingFragment都会出现.第一个调用不应该删除任何东西,因为它在那时它不存在.所有后续调用都应删除现有的LoadingFragment并再次添加.

发生的事情是第一次调用setLoading(true)确实创建了LoadingFragment并将其放在正确的容器中.但是,后续调用setLoading(true)会删除片段,但似乎永远不会重新添加.我已经检查过该片段确实存在,并且在添加它的时候是LoadingFragment类型,我还检查过以确保它正在调用onCreateView方法.

难道我做错了什么?

编辑

使用H Raval下面给出的答案作为基础我现在提出以下内容:

public void setLoading(boolean loading, boolean top) {
    FragmentManager fragmentManager = getFragmentManager();

    Fragment currentLoadingFragment = fragmentManager.findFragmentById(R.id.loadingFragment);
    if (currentLoadingFragment != null) {
        fragmentManager
                .beginTransaction()
                .remove(currentLoadingFragment)
                .commit();
    }

    if (loading) {
        int id = top ? R.id.topContainer : R.id.container;

        fragmentManager
                .beginTransaction()
                .add(id, new LoadingFragment())
                .commit();
    }
}

这似乎按预期工作.似乎主要区别在于此代码每次都创建一个新的LoadingFragment实例(当load = true时),而最初我试图使用相同的实例,只是使用FragmentManager添加/删除它.

出于兴趣,我有必要在使用remove后创建一个新实例吗?这是正确的方法吗?或者它应该在使用相同的实例时仍然有用吗?另外,如果建议每次都创建一个新实例,那么在清理,释放资源等方面我应该做些什么(也许有一种方法可以优雅地破坏过时的实例)?

最佳答案 好吧,我已经对你的代码做了一些改变,并且对我来说非常适合.如果你遇到任何困难,我知道

public void loadFragment(boolean loading, boolean top){
        FragmentManager fragmentManager = getSupportFragmentManager();

          loadingFragment = new LoadingFragment();

        // Only if loading is true should we display the fragment
        if (loading) {
            // Decide which container we're going to put the fragment in
            int id = top ? R.id.topContainer : R.id.container;

            if(top){
                if(fragmentManager.findFragmentByTag("loadingFragment")!=null)
                    fragmentManager.beginTransaction().remove(fragmentManager.findFragmentByTag("loadingFragment")).commit();

                fragmentManager
                        .beginTransaction()
                        .replace(R.id.topContainer, loadingFragment,"toploadingFragment")
                        .commit();
            }else{
                if(fragmentManager.findFragmentByTag("toploadingFragment")!=null)
                    fragmentManager.beginTransaction().remove(fragmentManager.findFragmentByTag("toploadingFragment")).commit();

                fragmentManager
                        .beginTransaction()
                        .replace(R.id.container, loadingFragment,"loadingFragment")
                        .commit();
            }

        }
点赞