




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、使用Fragment創建動態UI使用Fragment創建動態UI在Android中創建動態、多欄的UI,你需要將UI組件和Activity行為封裝到模塊中,以便在Activity中交換。你可以使用Fragment類創建這些模塊,這種行為有點像一個可以自己定義布局和管理生命周期的嵌套Activity。當一個Fragment指定它自身的布局時,它能和Activity內的其它Fragment配置成不同的組合以便為不同的屏幕大小修改你的布局結構(小屏幕一次可能只顯示一個Fragment,大屏幕則可以顯示兩個或更多)。本課程展示了如何使用Fragment創建動態的用戶體驗以及為不同屏幕大小的設備優化Ap
2、p的用戶體驗,同時繼續支持運行于低至Android1.6版本的設備。創建Fragment你可以認為Fragment是Activity的一個模塊化部分,它有自己的生命周期,有自己的輸入事件,并且你還可以在Activity運行時添加或移除它(有點像可以在不同的Activity中重用的“子Activity”)。這節內容展示了如何使用支持庫繼承Fragment,使你的App可以和運行低至Android1.6的設備保持兼容。注意:如果你決定了App要求的最小API級別為11以上,你可以使用框架內建的Fragment類及相關的API,而不需要使用支持庫。只要知道這節課的重點在于使用支持庫API,它使用特定
3、的包簽名,并且某些API名稱和平臺包含的版本有點不同。在你開始課程之前,你必須設置你的Android項目使用支持庫。如果你之前沒有使用支持庫,按“安裝支持庫”文檔所說的把你的項目設為使用v4庫,你也可以使用v7 appcompat庫以便在Activity中包含操作欄,v7兼容Android2.1(API級別7)并且也包含Fragment API。創建Fragment類要創建Fragment,從Fragment類繼承,重寫關鍵的生命周期方法以插入App的應用邏輯,就像你在Activity類做的一樣。不同的是,創建Fragment時,你必須在onCreateView()回調方法中定義布局。事實上,
4、這是運行Fragment所需要的唯一回調方法。下例是一個指定自己布局的簡單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一樣,Fragment應該實現其它的生命周期回調方法,這樣,當它在Activity中被添加或移除時,以及Activity本身在生命周期狀態中切換時,允許你管理Fragment的狀態。例如,Activity的onPause()被調用時,Activity中的所有Fragment也會收到onPause()的調用。更多有關Fragment生命周期和回調方法的信息,請
6、參考Fragment開發者指南。使用XML向Activity添加FragmentFragment是可重用的、模塊化的UI組件,每個Fragment類的實例都必須關聯一個父FragmentActivity。你可以在Activityr的布局XML文件中定義每一個Fragment來獲取這種關聯。注意:FragmentActivityj 是一個支持庫提供的特殊的Activity,用來在低于API級別11的系統版本中處理Fragment。如果你支持的最低系統版本高于API級別11,你可以使用Activity。這里是一個當設備屏幕為“大”(目錄名使用了“large”修飾符)時,向Activity添加兩個F
7、ragment的布局文件的示例:res/layout-large/news_articles.xml 提示:更多有關為不同屏幕大小創建布局的內容,參看“支持不同屏幕大小”。在Activity中應用布局: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應該繼承ActionBarActivity,這是FragmentActivity的一個子類(更多信息請參見“添加操作欄”)。注意:當你通過在布局XML文件中的聲明Fragment的方式向Activity布局添加Fragment時,你不能在運行時移除Fragment。如果你打算在用戶交互時交換Fragment,你必須在Activity首次啟動時添加Fragment,這將在下一節演示。構建靈活的UI當為較大范圍的屏幕尺寸設計應用程
9、序時,你可以基于屏幕所允許的空間,在不同的布局配置中重用Fragment以優化用戶體驗。例如,在手機設備上為單面板用戶界面一次只顯示一個Fragment,相反,在有較寬屏幕尺寸的平板上可以并排設置Fragment來為用戶顯示更多信息。兩個Fragment,用不同配置顯示在不同屏幕尺寸上的同一個Activity中。在大屏幕上,兩個Fragment并排顯示,而在手機設備上,一次只顯示一個Fragment,必須在用戶導航時用一個Fragment替換另一個。FragmentManager類提供方法允許你在運行時為Activity添加、移除以及替換Fragment,從而創建動態用戶體驗。在運行時向Act
10、ivity添加Fragment相比在布局文件中為Activity定義Fragment就象上節課中演示的使用元素你可以在Activity運行時添加Fragment,如果你打算在Activity生存期內改變Fragment,你必須這樣做。要執行添加或移除Fragment的事務,你必須使用FragmentManager創建一個FragTransaction,它提供了添加、移除、替換及執行其它Fragment事務的API。如果你的Activity允許移除或替換Fragment,你應該在onCreate()方法中添加初始化Fragment的代碼。在處理Fragment(尤其是那些運行時添加的)時有一個重
11、要的規則,在布局中必須有一個容器視圖供這些Fragment布局駐留。下面的布局是一個替換在上節內容中出現的一次只顯示一個Fragment的布局。為了用一個Fragment替換另一個,Activity包含一個FrameLayout做為Fragment的容器。注意文件名和上節內容中的布局文件名相同,但是目錄名中沒有“large”修飾符,因此這個布局用于設備屏幕比“large”小,不能同時填充兩個Fragment的情況中。res/layout/news_articles.xml在Activity中插入代碼,調用支持庫API的getSupportFragmentManager()方法獲得Fragmen
12、tManager,然后調用beginTransaction()創建FragmentTransaction,調用add()方法添加Fragment。你可以使用同一個FragmentTransaction執行多個Fragment事務,當你準備好要改變時,你必須調用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正在使用的包含Fragment容器FrameLayout的布局版本 if (findViewById(R.id.fragment_container) != null) / 如果我們是從較早的狀態中恢復 / 我們不需要做任何事情,直接返回 / 否則,我們可能會覆蓋掉已經存在的Fragment if (savedInstan
14、ceState != null) return; / 創建放在Activity中的新Fragment HeadlinesFragment firstFragment = new HeadlinesFragment(); / 在這個例子中,Activity是被Intent對象的特殊指令啟動的, / 把Intent的extras集合傳遞給Fragment做為參數 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()方法。請記住,當執行Fragment事務,如替換或刪除Fragment時,它通常允許用戶向后導航并“撤銷”改變。要允許用戶通過Fragment事務向后導航,你
16、必須在提交FragmentTransaction之前調用addToBackStack()方法。注意:當你移除或替換一個Fragment并把事務添加到返回棧時,被移除的Fragment處于停止狀態(不是被銷毀)。如果用戶向后導航以恢復Fragment,它會重新啟動。如果你沒有向返回棧中添加事務,那么移除或替換Fragment時,它被銷毀。下面是替換Fragment的例子:/ 創建一個Fragment并給它指定一個要顯示的文章做為參數ArticleFragment newFragment = new ArticleFragment();Bundle args = new Bundle();args
17、.putInt(ArticleFragment.ARG_POSITION, position);newFragment.setArguments(args);FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();/ 用這個Fragment替換Fragment容器中的內容/ 向返回棧中添加事務以便用戶可以向后導航transaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null)
18、;/ 提交事務mit();addToBackStack()方法有一個可選參數來為事務指定唯一名稱,不需要這個名稱,除非你打算用FragmentManager.BackStackEntry API來執行Fragment的高級操作。和其它Fragment通信為了重用Fragment UI組件,你應該定義一個完全獨立的、模塊化的組件,它定義了自己的布局和行為。一旦你定義了這些可重用的Fragment,你可以把它們和Activity結合起來,并關連應用程序邏輯以實現整體組合UI。通常你會希望一個Fragment能和其它Fragment通信,比如基于用戶事件改變內容。所有Fragment到Fragmen
19、t的通信都是通過相關的Activity,兩個Fragment之間應該永遠不要直接通信。定義接口要允許一個Fragment和它所在的Activity通信,你可以在Fragment類中定義一個接口,在Activity中實現它。Fragment會在onAttach()生命周期回調方法中捕獲接口的實現,并能調用接口方法和Activity通信。下面是Fragment和Activity通信的例子:public class HeadlinesFragment extends ListFragment OnHeadlineSelectedListener mCallback; / 容器Activity必須實現
20、這個接口 public interface OnHeadlineSelectedListener public void onArticleSelected(int position); Override public void onAttach(Activity activity) super.onAttach(activity); / 確保容器Activity實現了回調接口, / 否則,它會拋出異常 try mCallback = (OnHeadlineSelectedListener) activity; catch (ClassCastException e) throw new Cl
21、assCastException(activity.toString() + must implement OnHeadlineSelectedListener); .現在Fragment可以使用OnHeadlineSelectedListener接口的實例mCallback調用onArticleSelected()方法把消息發送給Activity。例如,當用戶點擊列表項時,Fragment中的方法使用回調接品把事件發送到父Activity: Override public void onListItemClick(ListView l, View v, int position, long
22、id) / 把事件發送到父Activity mCallback.onArticleSelected(position); 實現接口為了從Fragment中接收事件回調,父Activity必須實現在Fragment類中定義的接口。下面是一個實現上例中接口的例子:public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener . public void onArticleSelected(int position) / 當用戶選擇了HeadlinesF
23、ragment的標題時, / 完成顯示文章的代碼 發送消息到Fragment父Activity可以把消息發給通過findFragmentById()方法捕獲的Fragment實例,然后直接調用Fragment的公開方法。例如,假設上面的Activity包含另一個Fragment,用來顯示通過上面的回調方法獲得的列表項數據。在該例中,Activity可以把在回調方法中收到的信息傳遞給另一個Fragment并顯示它。public static class MainActivity extends Activity implements HeadlinesFragment.OnHeadlineSelectedListener . public void onArticleSelected(i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國網店裝修項目創業計劃書
- 中國紅薯種植項目創業計劃書
- 中國家庭理療設備項目創業計劃書
- 中國可信計算機項目創業計劃書
- 湖南飼料項目創業計劃書
- 安全教育測試題及答案
- 樂高面試題及答案
- 2025版權轉讓合同(稿酬版)
- 2025【合同范本】貸款擔保合同范本與訂立條件
- 2025企業租賃車輛合同模板
- 浙江省高等學校畢業生登記表
- 灌注樁后注漿施工記錄
- 論我國跨境賭破違法犯罪的危害及對策
- 喜之郎品牌策略
- 2023年智慧廣電網絡應用解決方案
- 新改版教科版三年級下冊科學全冊精編實驗總結(超全)
- 格力2匹柜機檢測報告KFR-50LW(50530)FNhAk-B1(性能)
- 工程質量保證措施
- 環保知識試題-環保知識試題及答案
- 《每個孩子都需要被看見 0 18歲 給孩子一個更好的原生家庭》讀書筆記思維導圖PPT模板下載
- 探尋中國茶一片樹葉的傳奇之旅2023章節測試答案-探尋中國茶一片樹葉的傳奇之旅超星爾雅答案
評論
0/150
提交評論