Fragment 使用詳解

和你一起終身學(xué)習(xí),這里是程序員Android
經(jīng)典好文推薦,通過閱讀本文,您將收獲以下知識點(diǎn):
一、Fragment 簡介
二、Fragment的設(shè)計(jì)原理
三、Fragment 生命周期
四、Fragment 在Activity中的使用方法
五、動態(tài)添加Fragment到Activity的方法
六、Activity 中獲取Fragment
七、Fragment 獲取宿主Activity的方法
八、兩個(gè)Fragment的通訊的方法
九、Fragment 與 Activity通訊方法
十、參考文獻(xiàn)
一、 Fragment 簡介
在學(xué)Fragment之前我們需要了解一下Fragment的繼承關(guān)系,F(xiàn)ragment 繼承關(guān)系如下:
java.lang.Object
? android.app.Fragment
Fragment 片段,在Activity 中常用于負(fù)責(zé)用戶界面部分,可以將多個(gè)Fragment組合在一個(gè)Activity中來創(chuàng)建多窗口UI,或者在Activity中重復(fù)使用某個(gè)Fragment。您可以將Fragment 視為Activity的模塊化組成部分,Fragment具有自己的生命周期,能接收自己的輸入事件,并且可以在Activity運(yùn)行時(shí)候添加或者移除Fragment。
Fragment必須嵌套在Activity中,其生命周期受Activity生命周期的影響。
二、Fragment的設(shè)計(jì)原理
Fragment主要是為了給大屏幕(平板等)上更加動態(tài)和靈活的UI設(shè)計(jì)提供支持。由于平板電腦的屏幕比手機(jī)屏幕大得多,因此可用于組合和交換UI 組件的空間更大。利用Fragment實(shí)現(xiàn)此類設(shè)計(jì)時(shí),您無需管理對視圖層次結(jié)構(gòu)的復(fù)雜更改。 通過將 Activity布局分成Fragment,您可以在運(yùn)行時(shí)修改Activity 的外觀,并在由 Activity 管理的返回棧中保留這些更改。
您應(yīng)該將每個(gè)Fragment都設(shè)計(jì)為可重復(fù)使用的模塊化Activity 組件。也就是說,由于每個(gè)Fragment 都會通過各自的生命周期回調(diào)來定義其自己的布局和行為,您可以將一Fragment加入多個(gè)Activity,因此,您應(yīng)該采用可復(fù)用式設(shè)計(jì),避免直接從某個(gè)Fragment直接操縱另一個(gè)Fragment。 這特別重要,因?yàn)槟K化片段讓您可以通過更改Fragment的組合方式來適應(yīng)不同的屏幕尺寸。 在設(shè)計(jì)可同時(shí)支持平板電腦和手機(jī)的應(yīng)用時(shí),您可以在不同的布局配置中重復(fù)使用您的Fragment,以根據(jù)可用的屏幕空間優(yōu)化用戶體驗(yàn)。 例如,在手機(jī)上,如果不能在同一 Activity內(nèi)儲存多個(gè)片段,可能必須利用單獨(dú)片段來實(shí)現(xiàn)單窗格UI。

通過兩個(gè)Fragment組合成一個(gè)Activity適應(yīng)平板,通過一個(gè)Fragment來適應(yīng)手機(jī)
三、Fragment 生命周期
1. Fragment 生命周期圖

Fragment 生命周期圖
2. Fragment生命周期回調(diào)方法
public void onAttach(Context context) {
// TODO Auto-generated method stub
Log.i(TAG, "----onAttach----");
super.onAttach(context);
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "----onCreate----");
// 在Fragment 中調(diào)用Activity 中的方法
((FragmentAutoCreate) getActivity()).test();
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "----onCreateView----");
// 將layout布局轉(zhuǎn)換成View
View view = inflater.inflate(R.layout.fragment_left_layout, null);
Toast.makeText(getActivity(),
"通過對外提供方法setMsg(String msg),供Activity 調(diào)用", 0).show();
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.i(TAG, "----onActivityCreated----");
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
}
@Override
public void onStart() {
Log.i(TAG, "----onStart----");
// TODO Auto-generated method stub
super.onStart();
}
@Override
public void onResume() {
Log.i(TAG, "----onResume----");
// TODO Auto-generated method stub
super.onResume();
}
@Override
public void onPause() {
Log.i(TAG, "----onPause----");
// TODO Auto-generated method stub
super.onPause();
}
@Override
public void onStop() {
Log.i(TAG, "----onStop----");
// TODO Auto-generated method stub
super.onStop();
}
@Override
public void onDestroyView() {
Log.i(TAG, "----onDestroyView----");
// TODO Auto-generated method stub
super.onDestroyView();
}
@Override
public void onDestroy() {
Log.i(TAG, "----onDestroy----");
// TODO Auto-generated method stub
super.onDestroy();
}
@Override
public void onDetach() {
Log.i(TAG, "----onDetach----");
// TODO Auto-generated method stub
super.onDetach();
}
3.Fragment 在宿主Activity 的生命周期
Fragment不能脫離Activity而存在,其生命周期受Activity 生命周期影響

Activity于Fragment生命周期交互圖

Log 打印信息如上
四、Fragment 在Activity中的使用方法
1.靜態(tài)添加Fragment到Activity
<fragment
android:id="@+id/left_fragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
class="com.programandroid.Fragment.FragmentLeft" />
2.創(chuàng)建自定義Fragment類
實(shí)現(xiàn)方法如下
public class FragmentRight extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 將layout布局轉(zhuǎn)換成View
View view = inflater.inflate(R.layout.fragment_right_layout, null);
// 取出值
Bundle values = getArguments();
if (values != null) {
String str = values.getString("key", "");
Toast.makeText(getActivity(), "接收Activity傳遞的至為:" + str, 0).show();
} else {
Toast.makeText(getActivity(), "接收Activity傳遞的至為空", 0).show();
}
return view;
}
}
五、動態(tài)添加Fragment到Activity中
1.創(chuàng)建自定義Fragment類
public class FragmentRight extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 將layout布局轉(zhuǎn)換成View
View view = inflater.inflate(R.layout.fragment_right_layout, null);
// 取出值
Bundle values = getArguments();
if (values != null) {
String str = values.getString("key", "");
Toast.makeText(getActivity(), "接收Activity傳遞的至為:" + str, 0).show();
} else {
Toast.makeText(getActivity(), "接收Activity傳遞的至為空", 0).show();
}
return view;
}
}
2.創(chuàng)建Fragment填充布局載體
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/fl_left"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#f00" />
<FrameLayout
android:id="@+id/fl_right"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="#0f0" />
</LinearLayout>
3.使用FragmentManager動態(tài)填充
1.創(chuàng)建容器接收Fragment 的Activity容器。
2.使用FragmentManager與Fragment進(jìn)行交互
3.開啟事務(wù)將Fragment 填充到Activity 創(chuàng)建的容器中
4.提交事務(wù)。
public class FragmentAutoCreate extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_autocreate);
// 獲取fragmentManager --->開啟事務(wù)--->容器中填充內(nèi)容--->提交事務(wù)
// FragmentManager : Activity 內(nèi)部用來與Fragment進(jìn)行交互的接口
FragmentManager fragmentManager = getFragmentManager();
// 開啟一個(gè)事務(wù)
FragmentTransaction transaction = fragmentManager.beginTransaction();
// 將左右兩側(cè)的Fragment 添加的R.id.fl_left 所代表的容器視圖中
FragmentLeft leftFragment = new FragmentLeft();
transaction.add(R.id.fl_left, leftFragment, "left_tag");
// 1. 調(diào)用 Fragment 對外提供的方法
leftFragment.setMsg("tttt");
FragmentRight rightFragment = new FragmentRight();
// 2. Activity --setArguments-> 創(chuàng)值給Fragment
Bundle args = new Bundle();
args.putString("key", "Activity --setArguments-> 創(chuàng)值給Fragment ");
// 傳遞數(shù)據(jù)
rightFragment.setArguments(args);
transaction.add(R.id.fl_right, rightFragment);
// transaction.replace(R.id.fl_right, rightFragment);
// transaction.hide(rightFragment);
transaction.show(rightFragment);
// 提交事務(wù)
transaction.commit();
}
public void test() {
}
}
六、Activity 中獲取Fragment
Fragment idFragment=getFragmentManager().findFragmentById(R.id.fl_left);
FragmentRight tagFragment = (FragmentRight) getFragmentManager().findFragmentByTag("left_tag");
七、Fragment 獲取宿主Activity的方法
1. getActivity()方法獲取宿主Activity
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "----onCreateView----");
// 將layout布局轉(zhuǎn)換成View
View view = inflater.inflate(R.layout.fragment_left_layout, null);
Toast.makeText(getActivity(),
"通過對外提供方法setMsg(String msg),供Activity 調(diào)用", 0).show();
return view;
}
八、兩個(gè)Fragment的通訊的方法
1. 通過宿主Activity 到FragmentManger 方法獲取不同的Fragment
Fragment idFragment=getFragmentManager().findFragmentById(R.id.fl_left);
FragmentRight tagFragment = (FragmentRight) getFragmentManager().findFragmentByTag("left_tag");
九、Fragment 與 Activity通訊方法
1.Activity 調(diào)用 setArguments 方法
public class FragmentAutoCreate extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_autocreate);
// 獲取fragmentManager --->開啟事務(wù)--->容器中填充內(nèi)容--->提交事務(wù)
// FragmentManager : Activity 內(nèi)部用來與Fragment進(jìn)行交互的接口
FragmentManager fragmentManager = getFragmentManager();
// 開啟一個(gè)事務(wù)
FragmentTransaction transaction = fragmentManager.beginTransaction();
// 將左右兩側(cè)的Fragment 添加的R.id.fl_left 所代表的容器視圖中
FragmentLeft leftFragment = new FragmentLeft();
transaction.add(R.id.fl_left, leftFragment, "left_tag");
// 1. 調(diào)用 Fragment 對外提供的方法
leftFragment.setMsg("tttt");
FragmentRight rightFragment = new FragmentRight();
// 2. Activity --setArguments-> 創(chuàng)值給Fragment
Bundle args = new Bundle();
args.putString("key", "Activity --setArguments-> 創(chuàng)值給Fragment ");
// 傳遞數(shù)據(jù)
rightFragment.setArguments(args);
transaction.add(R.id.fl_right, rightFragment);
// transaction.replace(R.id.fl_right, rightFragment);
// transaction.hide(rightFragment);
transaction.show(rightFragment);
// 提交事務(wù)
transaction.commit();
}
public void test() {
}
}
2.通過Fragment 對外提供接口方法
通過Fragment對外提供接口方法,供Activity調(diào)用
public class FragmentLeft extends Fragment {
private static final String TAG = " F wj";
private String mMessage;
public void setMsg(String msg) {
this.mMessage = msg;
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "----onCreate----");
// 在Fragment 中調(diào)用Activity 中的方法
((FragmentAutoCreate) getActivity()).test();
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "----onCreateView----");
// 將layout布局轉(zhuǎn)換成View
View view = inflater.inflate(R.layout.fragment_left_layout, null);
Toast.makeText(getActivity(),
"通過對外提供方法setMsg(String msg),供Activity 調(diào)用", 0).show();
return view;
}
參考文獻(xiàn):
【騰訊文檔】Android 基礎(chǔ)知識庫
https://docs.qq.com/doc/DSWdKRWh1VnVHYWFP
友情推薦:
至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺得很優(yōu)秀,歡迎點(diǎn)擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請聯(lián)系小編刪除,歡迎您的建議與指正。同時(shí)期待您的關(guān)注,感謝您的閱讀,謝謝!
點(diǎn)擊閱讀原文,為大佬點(diǎn)贊!
