怎么让Fragment 切换时不重新执行生命周期的方法
2个回答
展开全部
很快聪明的你就会发现fragment的生命周期怎么不走了?onPause方法怎么不调用了?onResume怎么只调用一次了?
这时此时方法 onHiddenChanged派上用场了,当fragment隐藏时,该方法会调用传入参数为true表示该fragment被隐藏了,当fragment调用了show方法后,该方法传入的参数为false,表示该fragment正在显示!
所以总结起来,如果使用hide/show方法来控制fragment的使用时,原本需要在onResume以及onPause方法做的事情就可以迁移到 onHiddenChanged时进行管理,如:
if (hidden) {// 不在最前端界面显示 AA.onPause(); } else {// 重新显示到最前端中 BB.onResume(); }
可以自行做个demo测试,下面贴出完整的生命周期:
这时此时方法 onHiddenChanged派上用场了,当fragment隐藏时,该方法会调用传入参数为true表示该fragment被隐藏了,当fragment调用了show方法后,该方法传入的参数为false,表示该fragment正在显示!
所以总结起来,如果使用hide/show方法来控制fragment的使用时,原本需要在onResume以及onPause方法做的事情就可以迁移到 onHiddenChanged时进行管理,如:
if (hidden) {// 不在最前端界面显示 AA.onPause(); } else {// 重新显示到最前端中 BB.onResume(); }
可以自行做个demo测试,下面贴出完整的生命周期:
七鑫易维信息技术
2024-09-02 广告
2024-09-02 广告
Play Video 七鑫易维是致力于机器视觉和人工智能领域的高新科技企业,迄今已专注眼球追踪技术的研发、创新与应用超过14年,拥有完全自主知识产权,全球专利总量655余项。 作为眼球追踪技术领域的全球知名品牌,七鑫易维的产品体系覆盖眼动分...
点击进入详情页
本回答由七鑫易维信息技术提供
展开全部
fragment是我们经常使用到的一个控件,但是,相信大家会出现这样的一个问题,每次切换fragment的时候,fragment就会重新调用一次生命周期的方法,从而会重新加载一次数据,这样既消耗用户的数据流量和机器性能;
现在就教大家一个方法,来解决这个问题; 之前我们一直都是这样写的代码:
/**
* 根据传入的参数来改变当前的fragment
*
* @param fragment
*/
private void showFragment(Fragment fragment) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.main_fl_content, fragment);
transaction.commit();
}1234567891012345678910
翻看了Android官方文档,发现,replace()这个方法只是在上一个Fragment不再需要使用时采用的简便方法。正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。(这也是谷歌官方推荐的做法)
/**
* 修改显示的内容 不会重新加载
* to 下一个fragment
* mContent 当前的fragment
*/
private void switchContent(Fragment to) {
if (mContent != to) {
FragmentTransaction transaction = fragmentManager
.beginTransaction().setCustomAnimations(android.R.anim.fade_in, R.anim.slide_out);
if (!to.isAdded()) { // 判断是否被add过
// 隐藏当前的fragment,将 下一个fragment 添加进去
transaction.hide(mContent).add(R.id.main_fl_content, to).commit();
} else {
// 隐藏当前的fragment,显示下一个fragment
transaction.hide(mContent).show(to).commit();
}
mContent = to;
}
}
现在就教大家一个方法,来解决这个问题; 之前我们一直都是这样写的代码:
/**
* 根据传入的参数来改变当前的fragment
*
* @param fragment
*/
private void showFragment(Fragment fragment) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.main_fl_content, fragment);
transaction.commit();
}1234567891012345678910
翻看了Android官方文档,发现,replace()这个方法只是在上一个Fragment不再需要使用时采用的简便方法。正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。(这也是谷歌官方推荐的做法)
/**
* 修改显示的内容 不会重新加载
* to 下一个fragment
* mContent 当前的fragment
*/
private void switchContent(Fragment to) {
if (mContent != to) {
FragmentTransaction transaction = fragmentManager
.beginTransaction().setCustomAnimations(android.R.anim.fade_in, R.anim.slide_out);
if (!to.isAdded()) { // 判断是否被add过
// 隐藏当前的fragment,将 下一个fragment 添加进去
transaction.hide(mContent).add(R.id.main_fl_content, to).commit();
} else {
// 隐藏当前的fragment,显示下一个fragment
transaction.hide(mContent).show(to).commit();
}
mContent = to;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询