Fragment是Android3.0之后提供的api,被大家广泛所熟知的主要原因还是因为随即附带的ViewPager控件。虽然我并不喜欢用它,但是它确实是一个相对不错的控件。还是我的一贯作风,我将从源码上向大家展示什么是Fragment。我们先写一个简单的代码对Fragment有个直观的认识:(为了保证我们方便调试,我们可以直接使用V4提供的源码包)
FragmentTransaction t = getSupportFragmentManager().beginTransaction(); t.add(android.R.id.content, new TestFragment1()); t.commitAllowingStateLoss();
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener
我们先来看下FragmentActivity:
android.support.v4.app.FragmentActivity
@Override protected void onCreate(Bundle savedInstanceState) { mFragments.attachActivity(this, mContainer, null); // Old versions of the platform didn't do this! <pre name="code" class="java"> if (getLayoutInflater().getFactory() == null) { getLayoutInflater().setFactory(this); }我们知道Activity才是Fragment的根,Fragment作为片段是相对Activity而言,Activity对于Fragment来说本质上是个控制器,用于分发不同的状态和业务。在onCreate的前半部分,有一个很重要的设置:
if (getLayoutInflater().getFactory() == null) { getLayoutInflater().setFactory(this); }
@Override public View onCreateView(String name, Context context, AttributeSet attrs) { if (!"fragment".equals(name)) { return super.onCreateView(name, context, attrs); } 。。。
if (fragment == null) { fragment = Fragment.instantiate(this, fname); fragment.mFromLayout = true; fragment.mFragmentId = id != 0 ? id : containerId; fragment.mContainerId = containerId; fragment.mTag = tag; fragment.mInLayout = true; fragment.mFragmentManager = mFragments; fragment.onInflate(this, attrs, fragment.mSavedFragmentState); mFragments.addFragment(fragment, true); }可以看出fragment的生成是通过Fragment的静态工厂方法帮你生成。而且生成之后将纳入mFragments的管理。那么什么是mFragments?实际上mFragments是FragmentManager对象,这是整个Framgent管理中非常重要的对象。但是,我们还是没有看到View的影子,不要着急,我们接着往下读:
if (fragment.mView == null) { throw new IllegalStateException("Fragment " + fname + " did not create a view."); } if (id != 0) { fragment.mView.setId(id); } if (fragment.mView.getTag() == null) { fragment.mView.setTag(tag); } return fragment.mView;发现了么?实际上,最终并不返回Fragment本身,而是返回Fragment的成员mView。但是我们并没有看到对这个成员的附值呀?实际上,在mFragments将Fragment add之后,已经对View进行赋值。不过我这里先卖个关子,下一章我们谈到Fragment的状态的时候我会回头来解释这个逻辑。
[Android]Fragment源码分析(一) 构造,布布扣,bubuko.com
原文地址:http://blog.csdn.net/hello__zero/article/details/38341795