編寫:fastcome1985 - 原文:http://developer.android.com/training/basics/fragments/fragment-ui.html
如果我們的APP設(shè)計(jì)成要支持范圍廣泛的屏幕尺寸時,在可利用的屏幕空間內(nèi),我們可以通過在不同的布局配置中重用fragment來優(yōu)化用戶體驗(yàn)。
http://wiki.jikexueyuan.com/project/android-training-geek/images/fragments-screen-mock.png" alt="fragments-screen-mock" />
圖1:兩個fragments,在同一個activity不同屏幕尺寸中用不同的配置來展示。在大屏幕上,兩個fragment被并排放置,在手持設(shè)備上,一次只放置一個fragment,所以在用戶導(dǎo)航中,兩個fragment必須進(jìn)行替換。
比起用<fragment>
標(biāo)簽在activity的布局文件中定義fragment,就像上節(jié)課說的,我們還可以在activity運(yùn)行時動態(tài)添加fragment,如果打算在activity的生命周期內(nèi)替換fragment,這是必須的。
為了執(zhí)行fragment的增加或者移除操作,必須通過 FragmentManager 創(chuàng)建一個FragmentTransaction對象, FragmentTransaction提供了用來增加、移除、替換以及其它一些操作的APIs。
如果我們的activity允許fragment移除或者替換,我們應(yīng)該在activity的onCreate()方法中添加初始化fragment(s).
運(yùn)用fragment(尤其是那些在運(yùn)行時添加的)的一個很重要的規(guī)則就是在布局中必須有一個容器View,fragment的layout將會放在這個view里面。
下面的這個布局是上節(jié)課的一次只顯示一個fragment的布局的替代布局。為了替換fragment,這個Activity的布局包含了一個空的 FrameLayout作為fragment的容器。
large
標(biāo)識, 所以這一布局將會在比large小的屏幕上被使用,因?yàn)樵撈聊粺o法滿足同時放置兩個fragmentsres/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" />
下例顯示了如何添加一個fragment到之前的layout中
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
@Override
public 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 FrameLayout
if (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 layout
HeadlinesFragment firstFragment = new HeadlinesFragment();
// In case this activity was started with special instructions from an
// Intent, pass the Intent's extras to the fragment as arguments
firstFragment.setArguments(getIntent().getExtras());
// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit();
}
}
}
<fragment>
定義的),activity 可以移除這個fragment或者用另外一個來替換它。Note:當(dāng)移除或者替換一個fragment并把它放入返回棧中時,被移除的fragment的生命周期是stopped(不是destoryed).當(dāng)用戶返回重新恢復(fù)這個fragment,它的生命周期是restarts。如果沒有把fragment放入返回棧中,那么當(dāng)它被移除或者替換時,其生命周期是destoryed。
// 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();