Activity 重启recreate() 与ViewPager一起使用出现的问题
有这样一个场景, activity
重启 activity.recareate()
但是会出现 如果启动很快,也就是在 viewPager
中添加 fragment
之前没有耗时的操作,
这时,系统会将没销毁的 fragment
重新附加到 viewPager
中,并没有新建一个 fragment
,fragment
在初始化的时候先去 manager
中找寻没有销毁的标识的 tagFragment
,
FragmentPagerAdapter
的部分源码:尤其是 instantiateItem
方法
public abstract class FragmentPagerAdapter extends PagerAdapter {private static final String TAG = "FragmentPagerAdapter";private static final boolean DEBUG = false;private final FragmentManager mFragmentManager;private FragmentTransaction mCurTransaction = null;private Fragment mCurrentPrimaryItem = null;public FragmentPagerAdapter(FragmentManager fm) {mFragmentManager = fm;}.....@Overridepublic Object instantiateItem(ViewGroup container, int position) {if (mCurTransaction == null) {mCurTransaction = mFragmentManager.beginTransaction();}final long itemId = getItemId(position);// Do we already have this fragment?String name = makeFragmentName(container.getId(), itemId);Fragment fragment = mFragmentManager.findFragmentByTag(name);if (fragment != null) {if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);mCurTransaction.attach(fragment);} else {fragment = getItem(position);if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);mCurTransaction.add(container.getId(), fragment,makeFragmentName(container.getId(), itemId));}if (fragment != mCurrentPrimaryItem) {fragment.setMenuVisibility(false);fragment.setUserVisibleHint(false);}return fragment;}.........public long getItemId(int position) {return position;}private static String makeFragmentName(int viewId, long id) {return "android:switcher:" + viewId + ":" + id;}
}
复制代码
为了重启新建 Fragment
,我这里给出最简单的方法,在 Activity
的 recareate()
方法中移除 fragment
,
如下所示:
@Overridepublic void recreate() {try {//避免重启太快恢复FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();for (Fragment fragment : fragmentAdapter.getFragmentsList()) {fragmentTransaction.remove(fragment);}fragmentTransaction.commitAllowingStateLoss();} catch (Exception e) {}super.recreate();}
复制代码
这样在 Activity
在重启时,就会及时创建新的 fragment
。
Activity 重启recreate() 与ViewPager一起使用出现的问题相关推荐
- activity重启问题
A调用B,B关闭后,A自动重启,原因:A与b的方向不一样 ##横竖屏切换的生命周期 * 默认横竖屏切换Activity被销毁又重新创建,有2中解决方案: 1. 可以把屏幕的朝向写死 a ...
- Activity中recreate方法的应用
參考两篇文章:http://blog.csdn.net/watermusicyes/article/details/47392949 http://blog.csdn.net/droyon/artic ...
- Android防止App崩溃的,Android App Crash之后如何禁止Activity重启
针对crash,android默认的处理方式是,退出app.弹一个提示框. /** * 初始化 * * @param context */ public void init(context conte ...
- Activity重新创建之recreate
Android在3.0之后,Activity引入了新的一个方法:recreate(),从字面意思就知道是重新创建Activity的,3.0+版本才可以使用. /*** 调用recreate方法重新创建 ...
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之停止和重启Activity
原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/stopping.html#Start 在activity的 ...
- Android Activity自动重启的问题
描述: 最近在做项目时,碰到一个诡异的问题,各种可能的导致的原因排查了一天的时间,最后才解决.为什么说诡异,是因为正常情况下是不会出现该问题的,而且百度上还真找不到相关的资料. 问题表现:一个普通的A ...
- android 12 framework开发第53节-Activity的reLaunch及onConfigurationChanged android源码分析
hi,同学们大家好! 1.Configuration应用开发背景 今天要给大家分享内容就是我们应用开发时候经常会遇到问题,那就是如果系统一些属性变化了,比如语言,横竖屏幕,深色模式等.就会导致系统当前 ...
- android 切换语言重启应用程序,不重启应用,android APP内部国际化
当前android的语言切换,很多项目中都是切换以后需要重启项目,这样的体验是不好的,如何实现当前界面切换,立即能看到效果? 目前项目中只支持中文和英文,具体实现: 在BaseActivity中: 在 ...
- 【翻译】Activity
转载请注明出处:http://blog.csdn.net/kester_/article/details/52503653 参考地址:https://developer.android.com/ref ...
最新文章
- mysql 常用函数循环_近30个MySQL常用函数,看到就是学到,纯干货收藏!
- 2018-3-27 专家系统
- CSS3 美女动画相框
- C# 语句中的各种单例模式代码
- Vuforia 6.1提供4个版本下载
- MySIAM与Innodb引擎
- es 同义词 热更新 1.1版本
- nw.js启动时白屏
- 计算机视觉应关注的资源
- matlab 棍,双足机器人行走棍图怎么用MATLAB画出来
- [Android开源项目] GitHub开源项目总结 (转)
- python max取下标_Python 变量类型总结
- 安卓平板微信和手机微信同时登陆_Mac电脑如何同时登陆多个微信或QQ
- 我的世界服务器虚拟菜单插件,《我的世界》服务器快捷菜单插件怎么用?
- 区块链加密算法小探(一)
- tornado web高级开发项目
- Android开发笔记1之HelloWorld
- 独家 | 李飞飞亲口跟我们说:离职Google是假新闻
- axios Post无法传递数据的解决方案
- 写代码如坐禅:你是哪一类程序员