我在我的活动中编写了一个方法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
后创建新实例?这是正确的方法吗?或者它应该在使用相同的实例时仍然有用吗?另外,如果建议每次都创建一个新实例,那么在清理,释放资源等方面我应该做些什么(也许有一种方法可以优雅地破坏过时的实例)?
答案 0 :(得分:1)
我已经对你的代码进行了一些修改,对我来说非常适合..如果你遇到任何困难我知道吗
javac -g