删除片段然后重新添加它

时间:2016-03-01 07:56:29

标签: android android-layout android-fragments

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

我想要发生的事情是每次调用LoadingFragment时我的setLoading(true)都会出现。第一个调用不应该删除任何东西,因为它在那时它不存在。所有后续调用都应删除现有的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实例(当loading = true时),而最初我尝试使用相同的实例,只是使用{{添加/删除它1}}。

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

1 个答案:

答案 0 :(得分:1)

我已经对你的代码进行了一些修改,对我来说非常适合..如果你遇到任何困难我知道吗

javac -g
相关问题