編輯:關於Android編程
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!
if (getLayoutInflater().getFactory() == null) {
getLayoutInflater().setFactory(this);
}
我們知道Activity才是Fragment的根,Fragment作為片段是相對Activity而言,Activity對於Fragment來說本質上是個控制器,用於分發不同的狀態和業務。在onCreate的前半部分,有一個很重要的設置:
if (getLayoutInflater().getFactory() == null) {
getLayoutInflater().setFactory(this);
}
這個是用來干嘛的呢?~實際上,你如果了解一點LayoutInflater的源碼其實並不會感到陌生,因為這個接口是為了構造你的View而存在。這就是偉大的Androidsdk開發者給你提供的擴展機會,不論你配置的東西是否繼承於View,只要你實現了這個接口,你就可以按照既定的規則構造出View。這個接口的實現方法在:
@Override
public View onCreateView(String name, Context context, AttributeSet attrs) {
if (!"fragment".equals(name)) {
return super.onCreateView(name, context, attrs);
}
。。。
我們先取前半部分代碼,我們很清楚的看出,實際上fragment標簽是被FragmentActivity特殊處理了。不知道你們是否理解了,如果不特殊處理,那麼交給默認邏輯處理的話,你的對象由於不繼承View一定會導致程序崩潰。那麼我們接著往下看:
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學習筆記二十四之ListView列表視圖二
前面一篇我們介紹了常用的幾種適配器的簡單實現和ListView的簡單使用,這一篇中,我們介紹一下ListView的優化和一些其它的問題。ListView優化方法一在Lis
android開發步步為營之55:google廣告平台admob接入總結
App變現的主要渠道有廣告,增值服務,在線交易。最近項目需要接入google的admob廣告平台,這裡寫個總結,方便其他開發者參考。第一步:通過android sdk m
Android ListView適配器(Adapter)優化方法詳解
Android ListView的優化,在做Android項目的時候,在用到ListView 界面及數據顯示,這個時候如果資源過大,對項目來說,用戶體驗肯定是不好的,這裡
Android初級教程初談自定義view自定義屬性
有些時候,自己要在布局文件中重復書寫大量的代碼來定義一個布局。這是最基本的使用,當然要掌握;但是有些場景都去對應的布局裡面寫對應的屬性,就顯得很無力。會發現,系統自帶的控