Android,使用activity与fragment的小结与使用的细节
来源:互联网 发布:淘宝和拍拍网的区别 编辑:程序博客网 时间:2024/06/14 01:04
该文章来自于我偶然逛知乎看到的一位答主所总结的,感觉总结的很好,拿来给大家分享、学习一下。
在Android3.0以后Fragment被大量的投入使用,然而在开发中会遇到很多问题,比如重建activity会导致多重fragment出现,fragment复杂的生命周期等影响,然而fragment带来的
强大的优势毕竟相比于Activity来说,却可以让我们选择这个利大于弊的fragment。然而很多fragment出现的问题往往是因为使用不当而造成多的。于是在我闲逛知乎的时候就
偶然的发现的下面这位技术很好的答主的回答。
作者:面条
链接:https://www.zhihu.com/question/39662488/answer/82469372
来源:知乎
强大的优势毕竟相比于Activity来说,却可以让我们选择这个利大于弊的fragment。然而很多fragment出现的问题往往是因为使用不当而造成多的。于是在我闲逛知乎的时候就
偶然的发现的下面这位技术很好的答主的回答。
作者:面条
链接:https://www.zhihu.com/question/39662488/answer/82469372
来源:知乎
fragment一般分为两类,一类是有UI的fragment,可以作为页面,作为View来展示,另一类是用没有UI的fragment,一般用作保存数据。
- 继承基类
public abstract class BaseFragment extends Fragment { protected View mRootView;@Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(null == mRootView){ mRootView = inflater.inflate(getLayoutId(), container, false); } return mRootView; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); afterCreate(savedInstanceState); }protected abstract int getLayoutId(); protected abstract void afterCreate(Bundle savedInstanceState);}
不过有一点,public View onCreateView 这个方法中返回之前判断一下你的mRootView是null再inflate,这样会比较好,在ViewPager中随着页面滑动这个方法会调用多次,inflate过了之后就直接用就好了。
- 使用静态工厂方法newInstance(...)来获取Fragment实例
还有就是Fragment推荐使用setArguments来传递参数,避免在横竖屏切换的时候Fragment自动调用自己的无参构造函数,导致数据丢失。
public static WeatherFragment newInstance(String cityName) { Bundle args = new Bundle(); args.putString(cityName,"cityName"); WeatherFragment fragment = new WeatherFragment(); fragment.setArguments(args); return fragment;}
- 状态保存/现场恢复
不要在Fragment里面保存ViewState!
不要在Fragment里面保存ViewState!
为了让你的代码更加清晰和稳定,最好区分清楚fragment状态保存和view状态保存,
如果某个属性属于View,则不要在Fragment中做它的状态保存,除非属性属于Fragment。
每一个自定义View都有义务实现状态的保存,可以像EditText一样,设置一个开关来选择是否保存
比如说:android:freezeText="true/false"。
public class CustomView extends View { ... @Override public Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); // 在这里保存当前状态 return bundle; } @Override public void onRestoreInstanceState(Parcelable state) { super.onRestoreInstanceState(state); // 恢复保存的状态 } ... }
处理fragment状态保存,例如保存从服务器获取的数据。
private String serverData; @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("data", serverData); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); serverData = savedInstanceState.getString("data"); }
- 避免错误操作导致Fragment的视图重叠
public class WeatherFragment extends Fragment { //TAG public static final String TAG = WeatherFragment.class.getSimpleName();
不过为了最大限度的重用,可以在Activity的onCreate(Bundle savedInstanceState)中判断savedInstanceState是否不为空;
不为空的话,先用getSupportFragmentManager(). findFragmentByTag()找一下,找到实例就不用再次创建。
WeatherFragment fragment = null;if(savedInstanceState!=null){fragment = getSupportFragmentManager().findFragmentByTag(WeatherFragment.TAG);}if(fragment == null){ fragment = WeatherFragment.newInstance(...);}
- 使用最大化的DialogFragment来实现浮动层级视图
不过这并不是最好的做法,在要考虑到Tablet适配的情况下,如下图
Tablet上是嵌入的,而手机上是占据全部空间。
此时可以把详情页单纯用Fragment实现,满足Tablet设备嵌入的需要,在手机上可以使用全屏的DialogFragment来包裹Fragment,之后只需要DialogFragment.show(...)即可。
从这里就可以看出,Fragment的使用其实是非常灵活的。
- 判断一个页面该使用Fragment还是Activity
例如SplashActivity和MainActivity没有太多的耦合度,此时可以分成两个Activity。
0 0
- Android,使用activity与fragment的小结与使用的细节
- Android Fragment的使用 三 Fragment与Activity交互
- Android的Activity与Fragment之一 配置使用Activity
- Fragment的使用与通信方式小结
- Fragment使用的细节,切换与交互数据
- Android Fragment的一些使用细节
- Fragment返回栈与Activity任务栈的结合使用
- 使用EventBus实现Activity与Fragment之间的跳转
- Android:Fragment 与 ViewPager的配合使用
- Android 中适配器与fragment或者activity的回调使用
- Android Fragment---与Activity生命周期的协调
- Android Fragment---与Activity生命周期的协调
- Activity与在Android的碎片Fragment
- Android Fragment---与Activity生命周期的协调
- Android Fragment---与Activity生命周期的协调
- android Activity与fragment的生命周期
- Android Fragment---与Activity生命周期的协调
- Android Fragment---与Activity生命周期的协调
- Unity Reflection Probe 测试
- 面试时,如何向公司提问?
- jQuery Mobile学习
- IOS 颜色转换成UIImage
- 线程等待与线程的返回值
- Android,使用activity与fragment的小结与使用的细节
- 小三角如何实现--css-before-after
- htons
- android 刷新媒体库(版本判断)
- 如何实现新闻详情页面
- python之open()函数
- 学习
- Myeclipse中package,source folder,folder区别
- 7 种将字符串反转的 Java 方法