Android2.x中使用Fragment的調查

Android2.x中使用Fragment的調查

  • Fragment介紹

Fragment是在android3.0中引入的,其功能和Activity基本相似,有自己的回調和生命週期,對於Fragment的理解我們可以解釋爲碎片或片段,這一點和DOM中的片段可以類比。

關於設計哲學、生命週期、事務管理、與Activity通信、ActionBar的使用,官方的文檔給出了比較詳細的說明,這裏不做贅述了。

http://developer.android.com/guide/components/fragments.html

 

  • Fragment應用場景

根據目前調查的情況這裏列出幾點

 

  1. 避免太多的Activity切換損傷系統的性能,FragmentActivity更輕量化
  2. 爲應用程序提供統一的UI(以更低的成本統一2.x到最新版本的UI
  3. 爲大屏設備提供更好的用戶體驗(例如新聞閱讀,標題列表和內容同時展現)
  • android2.x中使用Fragment
  • Google的解決方案:

GoogleAndroid2.x使用Fragment提供了支持,並提供了官方的類庫,可以從SDK Manager中下載,SDK Manager中的位置爲Extras > Android Support Library,下載後存放於android-sdks\extras\android\support\v4中。

一般情況下如果只使用Fragment的話,那麼該庫就夠用了,但是如果我們想用ActionBar的話,這個支持類庫的功能就不夠了。

  • Actionbarsherlock的解決方案:

該方案是使用actionbarsherlock開源類庫,該方案提供了FragmentActionBar的支持,其本身的Fragment支持採用的是Google解決方案的類庫。具體的使用類似於GreenDroid,需要使用該方案的應用程序需要導入actionbarsherlock項目。

  • 項目實踐:

本次調查因爲涉及到ActionBar,所以主要的輸出內容以actionbarsherlock作爲基礎。

  • 代碼獲取:

actionbarsherlock官方網站下載actionbarsherlock項目及demo

地址:https://github.com/JakeWharton/ActionBarSherlock/zipball/4.1.0

  • Eclipse中導入actionbarsherlock項目:

這裏有幾點需要注意:

1.因爲ADT版本差異,官方網站提供的導入步驟在較高版本的ADT中導入失敗,這裏採用的方法新建Android項目,然後將actionbarsherlocklibrary目錄作爲項目源碼拷貝到新建項目的根目錄下面,

2.actionbarsherlock中有的內容不好打包,只能通過項目引用的方式來工作。

3.編譯環境的AndroidSDK版本必須在3.2以後,即project.properties中的target必須大於等於13,但工作換進可以是2.x

  • 項目引用:

我們的項目如果需要引用該庫,需要這樣引入:

右鍵 > properties > Android > library > Add > actionbarsherlock項目

不是這樣:右鍵 > Build Path > Config Build Path > Project > Add > actionbarsherlock項目

  • 使用:

ActionBar使用:

 

  1. public class MainActivity extends BaseActivity{ 
  2.  
  3. private final static String TAB1 = "home"
  4.  
  5. private final static String TAB2 = "live"
  6.  
  7. private final static String TAB3 = "column"
  8.  
  9. private final static String TAB4 = "news"
  10.  
  11. private final static String TAB5 = "setting"
  12.  
  13. int mStackLevel = 1
  14.  
  15. HomeFragment homeFragment = new HomeFragment(); 
  16.  
  17. LiveFragment liveFragment = new LiveFragment(); 
  18.  
  19. ColumnFragment columnFragment = new ColumnFragment(); 
  20.  
  21. NewsFragment newsFragment = new NewsFragment(); 
  22.  
  23. SettingFragment settingFragment = new SettingFragment(); 
  24.  
  25. …………………………… 
  26.  
  27. protected void onCreate(Bundle savedInstanceState) { 
  28.  
  29. super.onCreate(savedInstanceState); 
  30.  
  31. setContentView(R.layout.fragment_stack); 
  32.  
  33. final ActionBar bar = getSupportActionBar() ; 
  34.  
  35.         bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
  36.  
  37.         bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 
  38.  
  39.         bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_home_bg) 
  40.  
  41.                 .setText(R.string.tab_label_home) 
  42.  
  43.                 .setTabListener(new TabListener(homeFragment,TAB1))); 
  44.  
  45.         bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_live_bg) 
  46.  
  47.                 .setText(R.string.tab_label_live) 
  48.  
  49.                 .setTabListener(new TabListener(liveFragment,TAB2))); 
  50.  
  51.         bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_column_bg) 
  52.  
  53.             .setText(R.string.tab_label_column) 
  54.  
  55.                 .setTabListener(new TabListener(columnFragment,TAB3))); 
  56.  
  57.         bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_news_bg) 
  58.  
  59.             .setText(R.string.tab_label_news) 
  60.  
  61.                 .setTabListener(new TabListener(newsFragment,TAB4))); 
  62.  
  63.         bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_setting_bg) 
  64.  
  65.             .setText(R.string.tab_label_setting) 
  66.  
  67.                 .setTabListener(new TabListener(settingFragment,TAB5))); 
  68.  
  69.         if (savedInstanceState != null) { 
  70.  
  71.             bar.setSelectedNavigationItem(savedInstanceState.getInt("tab"0)); 
  72.  
  73.         } 
  74.  
  75.  
  76. …………………… 
  77.  

說明:

  1. 這裏的ActionBar引用的是com.actionbarsherlock.app.ActionBar;
  2. 獲取ActionBar需要使用getSupportActionBar()方法
  3. 這裏的Fragment繼承自android.support.v4.app.Fragment;
  4. bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);表示使用Tab    頁形式展示。
  5. bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);顯示標題欄。

Fragment使用:

  1. public class SettingFragment extends BaseFragment { 
  2.  
  3. int mNum; 
  4.  
  5. private Button share; 
  6.  
  7. private Button clear; 
  8.  
  9. private Button contact; 
  10.  
  11. /** 
  12.  
  13.  * 該方法用於Fragment默認構造 
  14.  
  15.  * @return  
  16.  
  17.  */ 
  18.  
  19. public SettingFragment(){ 
  20.  
  21.  
  22. public SettingFragment(int num){ 
  23.  
  24. this.mNum = num; 
  25.  
  26.  
  27. /** 
  28.  
  29.  * When creating, retrieve this instance's number from its arguments. 
  30.  
  31.  */ 
  32.  
  33. @Override 
  34.  
  35. public void onCreate(Bundle savedInstanceState) { 
  36.  
  37. Utils.log("onCreate"); 
  38.  
  39. super.onCreate(savedInstanceState); 
  40.  
  41. mNum = getArguments() != null ? getArguments().getInt("num") : 5
  42.  
  43.  
  44. /** 
  45.  
  46.  * The Fragment's UI is just a simple text view showing its instance number. 
  47.  
  48.  */ 
  49.  
  50. @Override 
  51.  
  52. public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  53.  
  54. Bundle savedInstanceState) { 
  55.  
  56. Utils.log("onCreateView"); 
  57.  
  58. View v = inflater.inflate(R.layout.setting, container, false); 
  59.  
  60. getViews(v); 
  61.  
  62. setListener(); 
  63.  
  64. return v; 
  65.  
  66.  
  67. private void getViews(View container){ 
  68.  
  69. share = (Button)container.findViewById(R.id.setting_share_button); 
  70.  
  71. clear = (Button)container.findViewById(R.id.setting_clear_button); 
  72.  
  73. contact = (Button)container.findViewById(R.id.setting_contact_button); 
  74.  
  75.  
  76. private void setListener(){ 
  77.  
  78. share.setOnClickListener(new OnClickListener() { 
  79.  
  80. @Override 
  81.  
  82. public void onClick(View v) { 
  83.  
  84. startActivity(new Intent(getActivity(),ShareActivity.class)); 
  85.  
  86.  
  87. }); 
  88.  
  89. clear.setOnClickListener(new OnClickListener() { 
  90.  
  91. @Override 
  92.  
  93. public void onClick(View v) { 
  94.  
  95. startActivity(new Intent(getActivity(),ClearActivity.class)); 
  96.  
  97.  
  98. }); 
  99.  
  100. contact.setOnClickListener(new OnClickListener() { 
  101.  
  102. @Override 
  103.  
  104. public void onClick(View v) { 
  105.  
  106. startActivity(new Intent(getActivity(),ContactActivity.class)); 
  107.  
  108.  
  109. }); 
  110.  
  111.  



說明:
fragment第一次繪製它的用戶界面的時候, 系統會調用此方法。爲了繪製fragment的UI,此方法必須返回一個View, 這個view是你的fragment佈局的根view。如果fragment不提供UI, 可以返回null。

  • 建議:

根據目前調查的情況,這裏給出幾點建議

  1. ActionBar的位置位於標題欄位置,而項目中的Tab標籤位於屏幕底部,這裏使用ActionBar可能會給用戶點擊帶來一點小麻煩,可以考慮用戶滑動屏幕自動切換Tab頁。
  2. Fragment的主題以黑色爲主,直接替換項目可能會有些地方色彩不協調,細節部分可能需要再設計一下
  3. Fragment框架需要引入主題,該主題會包含一個標題欄,替換之前的自定義標題欄還需要調查(這裏是一個例子,更多的類容再向Fragment靠攏的開發中可能還會遇到)。
  • 結論:

項目向Fragment框架靠攏整理方案在技術上是可行的,並能因此提高系統的性能,但是在部分UI和用戶體驗上可能與之前的預期存在一點小差異,可能需要小修改。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章