Android使用Fragment創(chuàng)建動態(tài)UI_第1頁
Android使用Fragment創(chuàng)建動態(tài)UI_第2頁
Android使用Fragment創(chuàng)建動態(tài)UI_第3頁
Android使用Fragment創(chuàng)建動態(tài)UI_第4頁
Android使用Fragment創(chuàng)建動態(tài)UI_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、使用Fragment創(chuàng)建動態(tài)UI使用Fragment創(chuàng)建動態(tài)UI在Android中創(chuàng)建動態(tài)、多欄的UI,你需要將UI組件和Activity行為封裝到模塊中,以便在Activity中交換。你可以使用Fragment類創(chuàng)建這些模塊,這種行為有點像一個可以自己定義布局和管理生命周期的嵌套Activity。當(dāng)一個Fragment指定它自身的布局時,它能和Activity內(nèi)的其它Fragment配置成不同的組合以便為不同的屏幕大小修改你的布局結(jié)構(gòu)(小屏幕一次可能只顯示一個Fragment,大屏幕則可以顯示兩個或更多)。本課程展示了如何使用Fragment創(chuàng)建動態(tài)的用戶體驗以及為不同屏幕大小的設(shè)備優(yōu)化Ap

2、p的用戶體驗,同時繼續(xù)支持運行于低至Android1.6版本的設(shè)備。創(chuàng)建Fragment你可以認為Fragment是Activity的一個模塊化部分,它有自己的生命周期,有自己的輸入事件,并且你還可以在Activity運行時添加或移除它(有點像可以在不同的Activity中重用的“子Activity”)。這節(jié)內(nèi)容展示了如何使用支持庫繼承Fragment,使你的App可以和運行低至Android1.6的設(shè)備保持兼容。注意:如果你決定了App要求的最小API級別為11以上,你可以使用框架內(nèi)建的Fragment類及相關(guān)的API,而不需要使用支持庫。只要知道這節(jié)課的重點在于使用支持庫API,它使用特定

3、的包簽名,并且某些API名稱和平臺包含的版本有點不同。在你開始課程之前,你必須設(shè)置你的Android項目使用支持庫。如果你之前沒有使用支持庫,按“安裝支持庫”文檔所說的把你的項目設(shè)為使用v4庫,你也可以使用v7 appcompat庫以便在Activity中包含操作欄,v7兼容Android2.1(API級別7)并且也包含F(xiàn)ragment API。創(chuàng)建Fragment類要創(chuàng)建Fragment,從Fragment類繼承,重寫關(guān)鍵的生命周期方法以插入App的應(yīng)用邏輯,就像你在Activity類做的一樣。不同的是,創(chuàng)建Fragment時,你必須在onCreateView()回調(diào)方法中定義布局。事實上,

4、這是運行Fragment所需要的唯一回調(diào)方法。下例是一個指定自己布局的簡單Fragment:import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.ViewGroup;public class ArticleFragment extends Fragment Override public View onCreateView(LayoutInflater inflater, ViewGroup container,

5、 Bundle savedInstanceState) / 填充fragment的布局 return inflater.inflate(R.layout.article_view, container, false); 就像Activity一樣,F(xiàn)ragment應(yīng)該實現(xiàn)其它的生命周期回調(diào)方法,這樣,當(dāng)它在Activity中被添加或移除時,以及Activity本身在生命周期狀態(tài)中切換時,允許你管理Fragment的狀態(tài)。例如,Activity的onPause()被調(diào)用時,Activity中的所有Fragment也會收到onPause()的調(diào)用。更多有關(guān)Fragment生命周期和回調(diào)方法的信息,請

6、參考Fragment開發(fā)者指南。使用XML向Activity添加FragmentFragment是可重用的、模塊化的UI組件,每個Fragment類的實例都必須關(guān)聯(lián)一個父FragmentActivity。你可以在Activityr的布局XML文件中定義每一個Fragment來獲取這種關(guān)聯(lián)。注意:FragmentActivityj 是一個支持庫提供的特殊的Activity,用來在低于API級別11的系統(tǒng)版本中處理Fragment。如果你支持的最低系統(tǒng)版本高于API級別11,你可以使用Activity。這里是一個當(dāng)設(shè)備屏幕為“大”(目錄名使用了“l(fā)arge”修飾符)時,向Activity添加兩個F

7、ragment的布局文件的示例:res/layout-large/news_articles.xml 提示:更多有關(guān)為不同屏幕大小創(chuàng)建布局的內(nèi)容,參看“支持不同屏幕大小”。在Activity中應(yīng)用布局:import android.os.Bundle;import android.support.v4.app.FragmentActivity;public class MainActivity extends FragmentActivity Override public void onCreate(Bundle savedInstanceState) super.onCreate(save

8、dInstanceState); setContentView(R.layout.news_articles); 如果你使用了v7 appcompat庫,Activity應(yīng)該繼承ActionBarActivity,這是FragmentActivity的一個子類(更多信息請參見“添加操作欄”)。注意:當(dāng)你通過在布局XML文件中的聲明Fragment的方式向Activity布局添加Fragment時,你不能在運行時移除Fragment。如果你打算在用戶交互時交換Fragment,你必須在Activity首次啟動時添加Fragment,這將在下一節(jié)演示。構(gòu)建靈活的UI當(dāng)為較大范圍的屏幕尺寸設(shè)計應(yīng)用程

9、序時,你可以基于屏幕所允許的空間,在不同的布局配置中重用Fragment以優(yōu)化用戶體驗。例如,在手機設(shè)備上為單面板用戶界面一次只顯示一個Fragment,相反,在有較寬屏幕尺寸的平板上可以并排設(shè)置Fragment來為用戶顯示更多信息。兩個Fragment,用不同配置顯示在不同屏幕尺寸上的同一個Activity中。在大屏幕上,兩個Fragment并排顯示,而在手機設(shè)備上,一次只顯示一個Fragment,必須在用戶導(dǎo)航時用一個Fragment替換另一個。FragmentManager類提供方法允許你在運行時為Activity添加、移除以及替換Fragment,從而創(chuàng)建動態(tài)用戶體驗。在運行時向Act

10、ivity添加Fragment相比在布局文件中為Activity定義Fragment就象上節(jié)課中演示的使用元素你可以在Activity運行時添加Fragment,如果你打算在Activity生存期內(nèi)改變Fragment,你必須這樣做。要執(zhí)行添加或移除Fragment的事務(wù),你必須使用FragmentManager創(chuàng)建一個FragTransaction,它提供了添加、移除、替換及執(zhí)行其它Fragment事務(wù)的API。如果你的Activity允許移除或替換Fragment,你應(yīng)該在onCreate()方法中添加初始化Fragment的代碼。在處理Fragment(尤其是那些運行時添加的)時有一個重

11、要的規(guī)則,在布局中必須有一個容器視圖供這些Fragment布局駐留。下面的布局是一個替換在上節(jié)內(nèi)容中出現(xiàn)的一次只顯示一個Fragment的布局。為了用一個Fragment替換另一個,Activity包含一個FrameLayout做為Fragment的容器。注意文件名和上節(jié)內(nèi)容中的布局文件名相同,但是目錄名中沒有“l(fā)arge”修飾符,因此這個布局用于設(shè)備屏幕比“l(fā)arge”小,不能同時填充兩個Fragment的情況中。res/layout/news_articles.xml在Activity中插入代碼,調(diào)用支持庫API的getSupportFragmentManager()方法獲得Fragmen

12、tManager,然后調(diào)用beginTransaction()創(chuàng)建FragmentTransaction,調(diào)用add()方法添加Fragment。你可以使用同一個FragmentTransaction執(zhí)行多個Fragment事務(wù),當(dāng)你準備好要改變時,你必須調(diào)用commit()方法。下面是如何向Activity中添加Fragment的例子:import android.os.Bundle;import android.support.v4.app.FragmentActivity;public class MainActivity extends FragmentActivity Overrid

13、e public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); / 檢查Activity正在使用的包含F(xiàn)ragment容器FrameLayout的布局版本 if (findViewById(R.id.fragment_container) != null) / 如果我們是從較早的狀態(tài)中恢復(fù) / 我們不需要做任何事情,直接返回 / 否則,我們可能會覆蓋掉已經(jīng)存在的Fragment if (savedInstan

14、ceState != null) return; / 創(chuàng)建放在Activity中的新Fragment HeadlinesFragment firstFragment = new HeadlinesFragment(); / 在這個例子中,Activity是被Intent對象的特殊指令啟動的, / 把Intent的extras集合傳遞給Fragment做為參數(shù) firstFragment.setArguments(getIntent().getExtras(); / 把Fragment添加到容器FrameLayout中 getSupportFragmentManager().beginTrans

15、action() .add(R.id.fragment_container, firstFragment).commit(); 因為Fragment在運行時添加到FrameLayout容器中(替換在Activity布局文件中用元素定義的),Activity可以移除它,并用另一個Fragment替換它。用一個Fragment替換另一個替換Fragment的過程就是簡單的添加一個Fragment,只不過是用replace()方法代替add()方法。請記住,當(dāng)執(zhí)行Fragment事務(wù),如替換或刪除Fragment時,它通常允許用戶向后導(dǎo)航并“撤銷”改變。要允許用戶通過Fragment事務(wù)向后導(dǎo)航,你

16、必須在提交FragmentTransaction之前調(diào)用addToBackStack()方法。注意:當(dāng)你移除或替換一個Fragment并把事務(wù)添加到返回棧時,被移除的Fragment處于停止狀態(tài)(不是被銷毀)。如果用戶向后導(dǎo)航以恢復(fù)Fragment,它會重新啟動。如果你沒有向返回棧中添加事務(wù),那么移除或替換Fragment時,它被銷毀。下面是替換Fragment的例子:/ 創(chuàng)建一個Fragment并給它指定一個要顯示的文章做為參數(shù)ArticleFragment newFragment = new ArticleFragment();Bundle args = new Bundle();args

17、.putInt(ArticleFragment.ARG_POSITION, position);newFragment.setArguments(args);FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();/ 用這個Fragment替換Fragment容器中的內(nèi)容/ 向返回棧中添加事務(wù)以便用戶可以向后導(dǎo)航transaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null)

18、;/ 提交事務(wù)mit();addToBackStack()方法有一個可選參數(shù)來為事務(wù)指定唯一名稱,不需要這個名稱,除非你打算用FragmentManager.BackStackEntry API來執(zhí)行Fragment的高級操作。和其它Fragment通信為了重用Fragment UI組件,你應(yīng)該定義一個完全獨立的、模塊化的組件,它定義了自己的布局和行為。一旦你定義了這些可重用的Fragment,你可以把它們和Activity結(jié)合起來,并關(guān)連應(yīng)用程序邏輯以實現(xiàn)整體組合UI。通常你會希望一個Fragment能和其它Fragment通信,比如基于用戶事件改變內(nèi)容。所有Fragment到Fragmen

19、t的通信都是通過相關(guān)的Activity,兩個Fragment之間應(yīng)該永遠不要直接通信。定義接口要允許一個Fragment和它所在的Activity通信,你可以在Fragment類中定義一個接口,在Activity中實現(xiàn)它。Fragment會在onAttach()生命周期回調(diào)方法中捕獲接口的實現(xiàn),并能調(diào)用接口方法和Activity通信。下面是Fragment和Activity通信的例子:public class HeadlinesFragment extends ListFragment OnHeadlineSelectedListener mCallback; / 容器Activity必須實現(xiàn)

20、這個接口 public interface OnHeadlineSelectedListener public void onArticleSelected(int position); Override public void onAttach(Activity activity) super.onAttach(activity); / 確保容器Activity實現(xiàn)了回調(diào)接口, / 否則,它會拋出異常 try mCallback = (OnHeadlineSelectedListener) activity; catch (ClassCastException e) throw new Cl

21、assCastException(activity.toString() + must implement OnHeadlineSelectedListener); .現(xiàn)在Fragment可以使用OnHeadlineSelectedListener接口的實例mCallback調(diào)用onArticleSelected()方法把消息發(fā)送給Activity。例如,當(dāng)用戶點擊列表項時,F(xiàn)ragment中的方法使用回調(diào)接品把事件發(fā)送到父Activity: Override public void onListItemClick(ListView l, View v, int position, long

22、id) / 把事件發(fā)送到父Activity mCallback.onArticleSelected(position); 實現(xiàn)接口為了從Fragment中接收事件回調(diào),父Activity必須實現(xiàn)在Fragment類中定義的接口。下面是一個實現(xiàn)上例中接口的例子:public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener . public void onArticleSelected(int position) / 當(dāng)用戶選擇了HeadlinesF

23、ragment的標題時, / 完成顯示文章的代碼 發(fā)送消息到Fragment父Activity可以把消息發(fā)給通過findFragmentById()方法捕獲的Fragment實例,然后直接調(diào)用Fragment的公開方法。例如,假設(shè)上面的Activity包含另一個Fragment,用來顯示通過上面的回調(diào)方法獲得的列表項數(shù)據(jù)。在該例中,Activity可以把在回調(diào)方法中收到的信息傳遞給另一個Fragment并顯示它。public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener . public void onArticleSelected(i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論