Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI
原文地址:http://android.xsoftlab.net/training/basics/fragments/fragment-ui.html
當設計應用程序時需要支持尺寸較大的寬屏設備時,可以基于可用的屏幕空間在不同的布局中配置并重新使用fragment來提升用戶體驗。
舉個例子,手持設備在同一時間可能只適合展示一個界面,相反的,你可能希望在平板設備上一邊一個Fragment,因為平板有更寬的界面用來展示更多的信息。
上圖中:兩個Fragment,利用同一個Activity在不同的屏幕尺寸中展示出不同的界面效果。在大屏幕中,兩個fragment一邊一個,但是在手持設備上,只能在同一時間內放置一個fragment,所以只能在用戶使用的時候使用替換的方式來展示另一個fragment。
類FragmentManager支持在運行時添加、刪除、替換fragment,以便提供更靈活的體驗。
在運行時添加Fragment到Activity中
正如上節課展示的那樣,我們可以通過在布局文件中添加< fragment>標簽的方式定義fragment,不過,我們還可以在activity運行的時候添加fragment到activity中。如果你計劃在activity的生命周期內改變fragment的話,那么這項功能就很有必要了。
如果要執行類似添加、刪除fragment的這種事務,必須通過使用FragmentManager創建一個事務對象FragmentTransaction,它提供了添加、刪除、替換和其它fragment相關事務的功能。
如果activity允許fragment可以移除或者替換,那么必須在onCreate方法內初始化fragment并添加到activity中。
在處理fragment的時候有很重要的一條規則,尤其是在添加fragment的時候,就是activity必須包含一個容器View對象,以便fragment對象可以添加到這個容器中。
下面這個布局就是上一節課同時只顯示一個fragment更改過后的布局,為了可以替換fragment,activity的布局需要包含一個空的FrameLayout,當做fragment的容器。
注意,文件的名稱還是和上節課中布局的名字相同,但是布局的文件夾目錄名稱則不再包含”large”標識符,所以這個布局是在比”large”小的設備屏幕上使用的,因為這種屏幕不適合同時顯示多個fragment。
res/layout/news_articles.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent" />在activity中調用getSupportFragmentManager()方法獲得支持庫中的FragmentManager對象,然后調用這個對象的beginTransaction()方法創建FragmentTransaction事務對象,通過這個事務對象的add()方法添加fragment。
你還可以使用FragmentTransaction事務對象執行多個fragment的事務。當準備確認要應用這些改變是,你應該調用commit()方法。
舉個例子,下面這段代碼展示了如何在上面的布局中添加fragment:
import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.news_articles);// Check that the activity is using the layout version with// the fragment_container FrameLayoutif (findViewById(R.id.fragment_container) != null) {// However, if we're being restored from a previous state,// then we don't need to do anything and should return or else// we could end up with overlapping fragments.if (savedInstanceState != null) {return;}// Create a new Fragment to be placed in the activity layoutHeadlinesFragment firstFragment = new HeadlinesFragment();// In case this activity was started with special instructions from an// Intent, pass the Intent's extras to the fragment as argumentsfirstFragment.setArguments(getIntent().getExtras());// Add the fragment to the 'fragment_container' FrameLayoutgetSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();}} }因為fragment在運行時被添加到了FrameLayout中,所以activity可以使用另一個不同的fragment來替換它,或者可以移除它。
替換Fragment
替換fragment的過程和添加的過程很相似,只是需要使用replace()方法而不是add()方法。
記住,在執行fragment事務的時候,比如替換或者移除,經常需要適當的允許用戶可以通過返回撤銷改變。為了通過fragment事務允許用戶做到這一點,必須在FragmentTransaction事務提交之前調用addToBackStack()方法。
Note:當你通過移除或者替換將fragment作為事務添加到回退棧的時候,那個被移除的fragment會進入停止狀態(沒有被銷毀)。如果用戶通過返回還原了fragment,那么它就會重新啟動。如果沒有添加事務到回退棧,那么fragment在移除或者替換的時候會被銷毀。
這是個替換fragment的例子:
// Create fragment and give it an argument specifying the article it should show ArticleFragment newFragment = new ArticleFragment(); Bundle args = new Bundle(); args.putInt(ArticleFragment.ARG_POSITION, position); newFragment.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack so the user can navigate back transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit();addToBackStack()方法有一個可選的字符串參數,這個參數可以用來指定事務的唯一標示名稱。這個名稱不是必須的,除非你計劃通過FragmentManager.BackStackEntry API執行更佳的fragment操作。
總結
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚁群优化算法 ACO
- 下一篇: Android官方开发文档Trainin