Fragment 表示 Activity 中的行爲或用戶界面部分。您能夠將多個片斷組合在一個 Activity 中來構建多窗格 UI,以及在多個 Activity 中重複使用某個片斷。您能夠將片斷視爲 Activity 的模塊化組成部分,它具備本身的生命週期,能接收本身的輸入事件,而且您能夠在 Activity 運行時添加或移除片斷(有點像您能夠在不一樣 Activity 中重複使用的「子 Activity」)。android
-生命週期git
-簡單使用github
-Fragment 通訊bash
-源碼分析ide
Fragment 和 activity 同樣,也是有四種狀態模塊化
Resumed 當前 Fragment 位於前臺,用戶可見,能夠得到焦點;源碼分析
Paused 另外一個 Activity 處於前臺並擁有焦點, 可是該 Fragment 所在的 Activity 仍然可見(前臺 Activity 局部透明或者沒有覆蓋整個屏幕),不過不能得到焦點;佈局
Stopped 要麼是宿主 Activity 已經被中止, 要麼是 Fragment 從 Activity 被移除但被添加到回退棧中;中止狀態的 Fragment 仍然活着(全部狀態和成員信息被系統保持着)。 然而, 它對用戶再也不可見, 而且若是 Activity 被銷燬,它也會被銷燬;ui
Destroyed 只能等待被回收。this
附上 Activity 生命週期進行對比
Fragment 比 Activity 多了幾個額外的生命週期回調方法:
onAttach() 當碎片和活動創建關聯時調用。(得到 activity 的傳遞的值) onCreateView() 爲碎片建立視圖調用就是加載佈局時。 onActivityCreated() 確保與碎片相關聯的活動必定已經建立完畢的時候調用。 onDestroyView() 當與碎片的視圖被移除的時候調用。 onDetach()當碎片與活動解除關聯的時候調用。
Fragment 添加到 Activity 中有兩種方式一種是靜態添加,一種是動態添加
在對應的 Activity 中的 xml 中添加,實例以下
<fragment
android:id="@+id/a_fragment"
android:name="com.madreain.AFragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
</fragment>
複製代碼
通常都是把 xml 佈局中的 FrameLayout 做爲 Fragment 顯示的區域,而後經過 tab 欄按鈕來進行多個 Fragment 的切換
有兩篇文章很好的講解了Fragment使用中遇到的問題
FragmentTransaction有一些基本方法,下面給出調用這些方法時,Fragment生命週期的變化:
add(): onAttach()->…->onResume()。 remove(): onPause()->…->onDetach()。 replace(): 至關於舊Fragment調用remove(),新Fragment調用add()。 show(): 不調用任何生命週期方法,調用該方法的前提是要顯示的 Fragment已經被添加到容器,只是純粹把Fragment UI的setVisibility爲true。 hide(): 不調用任何生命週期方法,調用該方法的前提是要顯示的Fragment已經被添加到容器,只是純粹把Fragment UI的setVisibility爲false。 detach(): onPause()->onStop()->onDestroyView()。UI從佈局中移除,可是仍然被FragmentManager管理。 attach(): onCreateView()->onStart()->onResume()。
1.Fragment向Activity傳遞數據 1).接口回掉的方法 Fragment中定義接口,Activity中實現該接口。
AFragment
public interface OnFragmentCallback {
void onCallback(Object value);
}
複製代碼
AActivity
public class AActivity extends AppCompatActivity implements AFragment.OnFragmentCallback{
@Override
public void onCallback(Object value){
//todo獲取Fragment 向 Activity傳遞的數據
}
}
複製代碼
2).廣播方式
廣播具體實現參考 BroadcastReciver詳解
2.Activity 向 Fragment 傳遞數據(Bundle 和 setArguments(bundle))
1).Fragment建立時傳遞數據
在AActivity調用時
AFragment aFragment = AFragment.newInstance(object);
aFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
aFragment.show(getSupportFragmentManager(), AFragment.class.getName());
複製代碼
在AFragment中
public class AFragment extends DialogFragment {
private Object object;
/**
* 建立時傳入的對象,可傳入多個參數
*/
public static AFragment newInstance(Object object) {
AFragment fragment = new AFragment();
Bundle bundle = new Bundle();
bundle.putBoolean("object", object);
fragment.setArguments(bundle);
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//省略其餘代碼
Bundle bundle = getArguments();
//獲取到傳入的值進行顯示等使用
object = bundle.getString("object");
return v;
}
}
複製代碼
2).Fragment建立後設置數據
在AFragment中
public class AFragment extends DialogFragment {
private Object object;
public void setObject(Object object) {
this.object = object;
}
}
複製代碼
在AActivity中設置值
afragment.setObject("object")
複製代碼
3).廣播方式同上
3.Fragment之間通訊
1).經過Activity做爲中介,參考Fragment->Activity傳遞參數,而後ctivity->Fragment傳遞參數
2).廣播方式同上
後續文章將講解,盡情期待