編輯:關於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的狀態的時候我會回頭來解釋這個邏輯。
前面一篇我們介紹了常用的幾種適配器的簡單實現和ListView的簡單使用,這一篇中,我們介紹一下ListView的優化和一些其它的問題。ListView優化方法一在Lis
App變現的主要渠道有廣告,增值服務,在線交易。最近項目需要接入google的admob廣告平台,這裡寫個總結,方便其他開發者參考。第一步:通過android sdk m
Android ListView的優化,在做Android項目的時候,在用到ListView 界面及數據顯示,這個時候如果資源過大,對項目來說,用戶體驗肯定是不好的,這裡
有些時候,自己要在布局文件中重復書寫大量的代碼來定義一個布局。這是最基本的使用,當然要掌握;但是有些場景都去對應的布局裡面寫對應的屬性,就顯得很無力。會發現,系統自帶的控