Android 元件之Fragment建立小述
一、概述
Fragment是一種控制器物件,Activity可委派它完成一些任務。通常這些任務就是管理使用者介面,受管的介面可以是一整屏或者是整屏的一部分。Activity檢視含有可供Fragment檢視插入的位置,如果有多個Fragment要插入,Activity檢視也可提供多個位置。根據使用者或裝置的需要,Activity介面可以在執行時組裝甚至重新組裝,Activity自身並不具備這樣的靈活性,Activity檢視可以在執行時切換,但控制檢視的程式碼必須在Activity中實現,各個Activity和特定的使用者螢幕牢牢地繫結在了一起。正是採用這種Fragment而不是Activity進行應用的UI管理,使用Fragment及Activity來組裝或重新組裝使用者介面,在整個生命週期過程中,技術上來說Activity檢視並沒有改變,所以我們就可以繞開Android系統Activity規則的限制,這段定義摘自
二、靜態新增Fragment
這種方式新增主要分為兩步,首先建立待新增的Fragment並關聯其相應的xml佈局;之後在Activity佈局xml檔案之中新增我們需要的fragment,這樣我們就可以在Activity程式碼中直接使用該Fragment了,很簡單,但這樣也就必然會喪失其靈活性,因為這樣相當於將fragment的檢視與activity的檢視牢牢綁在了一起,在Activity中我們根本無法動態切換fragment檢視,下面我們來簡單看下例子:
這是我們建立的碎片MyFragment1,因為Fragment是在API11
public class MyFragment1 extends Fragment {
//這裡的Fragment為android.app.Fragment
@Nullable @Override public View onCreateView(LayoutInflater inflater
, @Nullable ViewGroup container
, Bundle savedInstanceState) {
//第一個引數:佈局的資源id
//第二個引數:檢視的父檢視,通常我們需要父檢視來正確配置元件
//第三個引數:告知佈局生成器是否將生成的佈局新增給父檢視
View view = inflater.inflate(R.layout.fragment_layout1, container, false);
return view;
}
}
這是我們上面MyFragment1所關聯的佈局fragment_layout1,沒有特殊的地方,只是很簡單的佈局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0ff">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#787878"
android:textSize="20sp"
android:text="這是靜態新增Fragment"
android:layout_centerInParent="true"
/>
</RelativeLayout>
這是我們的Activity佈局activity_main,這裡需要注意的是name屬性
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/my_fragment1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="zmj.myfragments.MyFragment1"
android:layout_marginTop="15dp"
/>
</RelativeLayout>
這是我們的活動MainActivity,在這裡也存在一個版本問題,在Android 3.0之後的版本中,我們可以直接使用Activity來管理fragment,但是如果我們想要相容老版本,則必須使用FragmentActivity類,因為在Android 3.0之前的版本中,Activity的內部還沒有實現管理Fragment的程式碼,我們這裡的AppCompatActivity就繼承自FragmentActivity類
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
三、動態新增Fragment
動態新增Fragment主要分為三個步驟,首先建立待新增的Fragment並關聯其相應的xml佈局;之後在Activity佈局xml檔案之中新增< FrameLayout >容器檢視用來託管我們需要的Fragment;最後在Activity程式碼中新增我們需要的fragment。下面是我們的Fragment2,關於版本相容問題在靜態新增時已經說了,我們來直接看下程式碼
public class MyFragment2 extends Fragment {
//這裡的Fragment為android.app.Fragment
@Nullable @Override public View onCreateView(LayoutInflater inflater
, @Nullable ViewGroup container
, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout2, container, false);
return view;
}
}
這是我們碎片MyFragment2所需要的佈局fragment_layout2,只是簡單的佈局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#787878"
android:textSize="20sp"
android:text="這是動態新增Fragment"
android:layout_centerInParent="true"
/>
</RelativeLayout>
這是我們的活動MainActivity的佈局activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/my_fragment2"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#f0f"
/>
</RelativeLayout>
這是我們的活動MainActivity,關於版本問題在靜態新增Fragment的介紹中已經提過了,在這裡就不贅述了,相對於靜態新增Fragment來說,動態新增Fragment就要靈活多了,我們可以在執行時動態的控制Fragment,也可以新增fragment,可以用其他的fragment替換當前的fragment,也可以移除fragment
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addFragment();
}
private void addFragment() {
//這裡的android.app.FragmentManager
FragmentManager fm = getFragmentManager();
MyFragment2 fragment2 = (MyFragment2) fm.findFragmentById(R.id.my_fragment2);
if(fragment2 == null){
fragment2 = new MyFragment2();
fm.beginTransaction()
.add(R.id.my_fragment2, fragment2)
.commit();
}
}
}
四、總結
本節主要簡單的介紹了建立Fragment的方法,如果想要檢視更多Fragment的基礎知識,去我的部落格目錄裡檢視吧,因為關於每塊知識點的介紹,部落格單節寫的比較零散,不容易查詢。