Android2.x中使用Fragment的調查html
Fragment是在android3.0中引入的,其功能和Activity基本類似,有本身的回調和生命週期,對於Fragment的理解咱們能夠解釋爲碎片或片斷,這一點和DOM中的片斷能夠類比。android
關於設計哲學、生命週期、事務管理、與Activity通訊、ActionBar的使用,官方的文檔給出了比較詳細的說明,這裏不作贅述了。git
http://developer.android.com/guide/components/fragments.htmlgithub
根據目前調查的狀況這裏列出幾點app
Google爲Android2.x使用Fragment提供了支持,並提供了官方的類庫,能夠從SDK Manager中下載,SDK Manager中的位置爲Extras > Android Support Library,下載後存放於android-sdks\extras\android\support\v4中。框架
通常狀況下若是隻使用Fragment的話,那麼該庫就夠用了,可是若是咱們想用ActionBar的話,這個支持類庫的功能就不夠了。ide
該方案是使用actionbarsherlock開源類庫,該方案提供了Fragment和ActionBar的支持,其自己的Fragment支持採用的是Google解決方案的類庫。具體的使用相似於GreenDroid,須要使用該方案的應用程序須要導入actionbarsherlock項目。佈局
本次調查由於涉及到ActionBar,因此主要的輸出內容以actionbarsherlock做爲基礎。性能
從actionbarsherlock官方網站下載actionbarsherlock項目及demo,網站
地址:https://github.com/JakeWharton/ActionBarSherlock/zipball/4.1.0
這裏有幾點須要注意:
1.由於ADT版本差別,官方網站提供的導入步驟在較高版本的ADT中導入失敗,這裏採用的方法新建Android項目,而後將actionbarsherlock的library目錄做爲項目源碼拷貝到新建項目的根目錄下面,
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使用:
- public class MainActivity extends BaseActivity{
- private final static String TAB1 = "home";
- private final static String TAB2 = "live";
- private final static String TAB3 = "column";
- private final static String TAB4 = "news";
- private final static String TAB5 = "setting";
- int mStackLevel = 1;
- HomeFragment homeFragment = new HomeFragment();
- LiveFragment liveFragment = new LiveFragment();
- ColumnFragment columnFragment = new ColumnFragment();
- NewsFragment newsFragment = new NewsFragment();
- SettingFragment settingFragment = new SettingFragment();
- ……………………………
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.fragment_stack);
- final ActionBar bar = getSupportActionBar() ;
- bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
- bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
- bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_home_bg)
- .setText(R.string.tab_label_home)
- .setTabListener(new TabListener(homeFragment,TAB1)));
- bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_live_bg)
- .setText(R.string.tab_label_live)
- .setTabListener(new TabListener(liveFragment,TAB2)));
- bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_column_bg)
- .setText(R.string.tab_label_column)
- .setTabListener(new TabListener(columnFragment,TAB3)));
- bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_news_bg)
- .setText(R.string.tab_label_news)
- .setTabListener(new TabListener(newsFragment,TAB4)));
- bar.addTab(bar.newTab().setIcon(R.drawable.tab_icon_setting_bg)
- .setText(R.string.tab_label_setting)
- .setTabListener(new TabListener(settingFragment,TAB5)));
- if (savedInstanceState != null) {
- bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
- }
- }
- ……………………
- }
說明:
Fragment使用:
- public class SettingFragment extends BaseFragment {
- int mNum;
- private Button share;
- private Button clear;
- private Button contact;
- /**
- * 該方法用於Fragment默認構造
- * @return
- */
- public SettingFragment(){
- }
- public SettingFragment(int num){
- this.mNum = num;
- }
- /**
- * When creating, retrieve this instance's number from its arguments.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- Utils.log("onCreate");
- super.onCreate(savedInstanceState);
- mNum = getArguments() != null ? getArguments().getInt("num") : 5;
- }
- /**
- * The Fragment's UI is just a simple text view showing its instance number.
- */
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- Utils.log("onCreateView");
- View v = inflater.inflate(R.layout.setting, container, false);
- getViews(v);
- setListener();
- return v;
- }
- private void getViews(View container){
- share = (Button)container.findViewById(R.id.setting_share_button);
- clear = (Button)container.findViewById(R.id.setting_clear_button);
- contact = (Button)container.findViewById(R.id.setting_contact_button);
- }
- private void setListener(){
- share.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- startActivity(new Intent(getActivity(),ShareActivity.class));
- }
- });
- clear.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- startActivity(new Intent(getActivity(),ClearActivity.class));
- }
- });
- contact.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- startActivity(new Intent(getActivity(),ContactActivity.class));
- }
- });
- }
- }
說明:
fragment第一次繪製它的用戶界面的時候, 系統會調用此方法。爲了繪製fragment的UI,此方法必須返回一個View, 這個view是你的fragment佈局的根view。若是fragment不提供UI, 能夠返回null。
根據目前調查的狀況,這裏給出幾點建議
項目向Fragment框架靠攏整理方案在技術上是可行的,並能所以提升系統的性能,可是在部分UI和用戶體驗上可能與以前的預期存在一點小差別,可能須要小修改。