Android編碼學習之Fragment

1. 什麼是Fragmentjava

Fragment是Android honeycomb 3.0新增的概念,Fragment名爲碎片不過卻和Activity十分類似。Fragment是用來描述一些行爲或一部分用戶界面在一個Activity中,android

(1)你能夠合併多個fragment在一個單獨的activity中創建多個UI面板,ide

(2)同時重用fragment在多個activity中。佈局

 你能夠認爲fragment做爲一個activity中的一節模塊 ,fragment有本身的生命週期,接收本身的輸入事件,你能夠添加或移除從運行中的activity。xml

 從中能夠看出:一個fragment必須老是嵌入在一個activity中,同時fragment的生命週期 受 activity而影響。當activity 暫停,那麼全部在這個activity的fragments將被destroy釋放。blog

2. Fragment的生命週期生命週期

  • onAttach()

  當fragment和activity被關聯時調用。事件

  • onCreate()

  當fragment建立時被調用,你應該初始化一些實用的組件,好比在fragment暫停或中止時須要恢復的utf-8

  • onCreateView()

  當系統調用fragment在首次繪製用戶界面時,若是畫一個UI在你的fragment你必須返回一個View固然了你能夠返回null表明這個fragment沒有UI.rem

public static class AndroidFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) { 
               return inflater.inflate(R.layout.android_fragment, container, false);
    }
}
  • onActivityCreated()

  當activity的onCreate()方法返回時調用。

  • onResumed()

  在running狀態下的可見狀態。

  • onPaused()

  另外一個activity在前景運行,而且享有焦點,可是這個fragment所在的activity仍然可見(前景activity部分遮擋或者是半透明的)。

  • onStop()

  fragment不可見。多是由於宿主activity處於stopped狀態,或者fragment被remove掉,而後加在了back stack中。

  一個處於stopped狀態的activity仍是存活狀態的,全部的狀態和成員信息會被系統保持。可是,它再也不被用戶可見,而且若是宿主activity被kill掉,它也會被kill掉。

  • onDestroyView()

  當fragment的UI被移除的時候調用。

  • onDetach()

  當fragment和activity去關聯時調用。

3. 建立Fragment

3.1 靜態建立

3.1.1 activity_main.xml,在一個xml文件中建立了兩個fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    <fragment
        android:id="@+id/fragment1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:name="com.egos.fragmentsample.Fragment1" />
    <fragment
        android:id="@+id/fragment2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:name="com.egos.fragmentsample.Fragment2" />
 
</LinearLayout>

3.1.2 分別建立兩個Fragment

//Fragment1.java
public class Fragment1 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment1, container, false);
	}
}
//Fragment2.java
public class Fragment2 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment1, container, false);
	}
}

3.1.3 建立main.activity

public class MainActivity extends FragmentActivity {
	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
		setContentView(R.layout.activity_main);
	}
}

3.2 動態建立

3.2.1 建立Fragment佈局

//Fragment_dynamic.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is a fragment" />
 
</LinearLayout>

3.2.2 建立DynamicFragment.java

public class DynamicFragment extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment_dynamic, container, false);
	}
 
}

3.2.3 建立main Activity佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout 
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"/>
 
</LinearLayout>

3.2.4 建立MainActivity.java

public class MainActivity extends FragmentActivity {
	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
		setContentView(R.layout.activity_main2);
		if (arg0 == null) {
			getSupportFragmentManager().beginTransaction().add(R.id.container, new DynamicFragment()).commit();
		}
	}
}

4. Fragment與Activity

4.1 fragment顯得更加靈活。能夠直接在XML文件中添加<fragment/>,Activity則不能

4.2 能夠在一個界面上靈活的替換一部分頁面,activity不能夠,作不到。

4.3 fragment和Activity之間的通訊:(也就是控件的相互操控)

  •   fragment控制fragment:獲得一個Activity,而後經過這個Activity的getFragmentManager()得到該Fragment的實例。
  •   fragment控制Activity:這個很簡單。每一個Fragment都有getActivity()獲得一個Activity的實例:

  View listView = getActivity().findViewById(R.id.list);PS:在當前activity和fragment已經進行關聯的狀況下不然返回null。

  •   Activity控制fragment:activity也能夠得到一個fragment的引用,從而調用fragment中的方法:

  xxxFragment xxx=getFragmentManager().findFragmentById();

  •   Activity控制Activity:這個顯然是經過Intent活動之間的通訊完成。別忘了在被打開的活動中建立Intent和獲得Intent一塊兒進行,寫個靜態的actionStart()。

4.4 fragment和Activity中控件的加載

  Fragment的載入是經過OnCreateView的時候經過inflater.inflate()加載佈局,而後經過修改main.xml,在main.xml上增長註冊fragment標籤,而後經過android:name來載入你已經經過inflater加載的隱藏佈局。有幾個關鍵點:fragment是經過inflater加載View而後在main.xml中註冊獲得的。固然若是你能夠在fragment中獲得View那就能夠經過View.findViewId()來操控fragment上的具體控件。

相關文章
相關標籤/搜索