Fragment是在Android 3.0 以后引入的,如果你想在3.0以前使用那就只能引入v4包了,它很好的解决了Android的碎片问题,尤其是在平板上更能显示出Fragment的优势.
Fragment既然这么好,如何加载呢?一种方法可以直接使用fragment布局,静态加载,另一种动态加载,在我们的应用中很少用到Fragment的静态加载方法,所以我们这里只讨论Fragment的动态加载.
1.Fragment是什么?
Fragment是一个控件,是一个window,是视图的一部分?让源码来告诉你Fragment到底是什么
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener
从这一句源码部分看不到任何View的影子,我们继续看
@Override
protected void onCreate(Bundle savedInstanceState) {
mFragments.attachActivity(this, mContainer, null);
// Old versions of the platform didn't do this!
if (getLayoutInflater().getFactory() == null) {
getLayoutInflater().setFactory(this);
}
super.onCreate(savedInstanceState);
NonConfigurationInstances nc = (NonConfigurationInstances)
getLastNonConfigurationInstance();
if (nc != null) {
mAllLoaderManagers = nc.loaders;
}
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
}
mFragments.dispatchCreate();
}
Fragment先绑定Activity,Activity对于Fragment来说本质上是个控制器,用于分发不同的状态和业务!
if (getLayoutInflater().getFactory() == null) {
getLayoutInflater().setFactory(this);
}
这一部分就是你意想的那个view,这个是用来干嘛的呢?实际上,你如果了解一点LayoutInflater的源码其实并不会感到陌生,因为这个接口是为了构造你的View而存在。这就是伟大的Androidsdk开发者给你提供的扩展机会,不论你配置的东西是否继承于View,只要你实现了这个接口,你就可以按照既定的规则构造出View。这个接口的实现方法在:
/**
* Add support for inflating the <fragment> tag.
*/
@Override
public View onCreateView(String name, @NonNull Context context, @NonNull AttributeSet attrs) {
if (!"fragment".equals(name)) {
return super.onCreateView(name, context, attrs);
}
final View v = mFragments.onCreateView(name, context, attrs);
if (v == null) {
return super.onCreateView(name, context, attrs);
}
return v;
}
还是看不出fragment是什么,我们继续
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
if (!"fragment".equals(name)) {
return null;
}
String fname = attrs.getAttributeValue(<