fragment之間的通訊,fragment和Activity生命週期之間的關係html
經過上一篇淺顯的學習了一下,怎麼在Activity中添加fragment。在介紹fragment之間的通訊以前,咱們來回顧一些fragment的生命週期:android
Activity的生命週期會影響fragment的生命週期的,針對Activity的每個生命週期的回調都會有一個相似的針對Fragment的回調,當Activity收到onPause()回調時,在Activity中每一個Fragment都會收到onPause()回調。ide
看到fragment的生命週期是否是有種似成相識感受,對,它和Activity的生命週期很像。對一些經常使用的生命週期函數作個說明:函數
onAttach()學習
當Fragment已經跟Activity關聯上的時候,這個回調被調用。Activity會做爲onAttach()回調方法的參數來傳遞。this
onCreateView()spa
建立跟Fragment關聯的視圖層時,調用這個回調方法。code
onActivityCreated()xml
當Activity的onCreate()方法執行完以後,調用這個回調方法。htm
onDestroyView()
當跟Fragment關聯的視圖層正在被刪除時,調用這個回調方法。
onDetach()
當從Activity中解除Fragment的關聯時,調用這個回調方法。
對於activity的理解能夠參考這篇博文:http://www.cnblogs.com/hibraincol/archive/2012/03/06/2382120.html
Activity和fragment有個很大的區別是:
Activity在onPause()後會本身進入到週期Stack當中, 而fragment須要調用addToBackStack()方法後才能回到backStack當中去,而後再一次啓動
下面就經過一個例子來講明fragment之間怎麼通訊的和fragment與activity之間的一些關係:
Mainactivity:
1 public class MainActivity extends FragmentActivity implements 2 interactiveActivity { // 別忘了要繼承接口 3 4 private TextView content = null; // ContentFragment中的TextView 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 System.out.println("MainActivity--->>onCreat()開始"); 11 ContentFragment contentfragment = new ContentFragment(); 12 TopFragment topfragment = new TopFragment(); 13 FragmentManager fm = getSupportFragmentManager(); 14 FragmentTransaction ft = fm.beginTransaction(); 15 ft.add(R.id.ActivityContent, contentfragment); 16 ft.add(R.id.Top, topfragment); 17 ft.commit(); 18 System.out.println("MainActivity--->>onCreat()結束"); 19 } 20 21 @Override 22 public boolean onCreateOptionsMenu(Menu menu) { 23 getMenuInflater().inflate(R.menu.main, menu); 24 return true; 25 } 26 27 @Override 28 public void showContent(int i) { 29 switch (i) { 30 case 1: 31 content.setText("第一頁"); 32 break; 33 case 2: 34 content.setText("第二頁"); 35 break; 36 case 3: 37 content.setText("第三頁"); 38 break; 39 default: 40 break; 41 } 42 } 43 44 @Override 45 protected void onStart() { 46 super.onStart(); 47 System.out.println("MainActivity--->>onStart()"); 48 //在MainActivity,oncreate()後,兩個fragment還須要調用本身onCreatView 49 content = (TextView) findViewById(R.id.content); 50 } 51 52 @Override 53 protected void onResume() { 54 super.onResume(); 55 System.out.println("MainActivity--->>onResume()"); 56 } 57 58 }
Mainactivity對應的XML文件activity_main.xml:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 tools:context=".MainActivity" > 7 8 <LinearLayout 9 android:id="@+id/Top" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:orientation="horizontal" /> 13 14 <LinearLayout 15 android:id="@+id/ActivityContent" 16 android:layout_width="match_parent" 17 android:layout_height="match_parent" 18 android:orientation="vertical" /> 19 20 </LinearLayout>
TopFragment的class
1 public class TopFragment extends Fragment implements OnClickListener { 2 3 public TopFragment() { 4 } 5 6 private interactiveActivity interact; 7 private Button btn1; 8 private Button btn2; 9 private Button btn3; 10 11 // 建立一個接口用於與activity之間進行交互 12 public interface interactiveActivity { 13 // 根據i的不一樣,對content 內容進行修改 14 public void showContent(int i); 15 } 16 17 /** Fragment第一次附屬於Activity時調用,在onCreate以前調用 */ 18 @Override 19 public void onAttach(Activity activity) { 20 super.onAttach(activity); 21 System.out.println("TopFragment--->>onAttach()"); 22 interact = (interactiveActivity) activity; 23 } 24 25 @Override 26 public void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 System.out.println("TopFragment--->>onCreate()"); 29 } 30 31 @Override 32 public View onCreateView(LayoutInflater inflater, ViewGroup container, 33 Bundle savedInstanceState) { 34 35 System.out.println("TopFragment--->>onCreateView()"); 36 // 在獲取了xml後對其中的控件進行實例化 37 return inflater.inflate(R.layout.top_fragment, container, false); 38 39 } 40 41 @Override 42 public void onStart() { 43 super.onStart(); 44 System.out.println("TopFragment--->>onStart"); 45 /* 46 * getActivity:Return the Activity this fragment is currently associated 47 * with getActivity()就是返回對應XML的Activity 48 */ 49 btn1 = (Button) getActivity().findViewById(R.id.one); 50 btn2 = (Button) getActivity().findViewById(R.id.two); 51 btn3 = (Button) getActivity().findViewById(R.id.three); 52 btn1.setOnClickListener(this); 53 btn2.setOnClickListener(this); 54 btn3.setOnClickListener(this); 55 56 } 57 58 @Override 59 public void onResume() { 60 super.onResume(); 61 System.out.println("TopFragment--->>onResume"); 62 63 } 64 65 // 按鈕的點擊監聽 66 @Override 67 public void onClick(View v) { 68 switch (v.getId()) { 69 case R.id.one: 70 interact.showContent(1); 71 break; 72 case R.id.two: 73 interact.showContent(2); 74 break; 75 case R.id.three: 76 interact.showContent(3); 77 break; 78 default: 79 break; 80 81 } 82 } 83 84 }
TopFragment所引用的top_fragment.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="horizontal" > <Button android:id="@+id/one" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="第一頁" /> <Button android:id="@+id/two" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="第二頁" /> <Button android:id="@+id/three" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="第三頁" /> </LinearLayout>
ContentFragment的class:
1 public class ContentFragment extends Fragment { 2 3 public ContentFragment() { 4 } 5 6 @Override 7 public void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 System.out.println("ContentFragment----->>onCreat()"); 10 } 11 12 @Override 13 public View onCreateView(LayoutInflater inflater, ViewGroup container, 14 Bundle savedInstanceState) { 15 16 System.out.println("ContentFragment----->>onCreatView()"); 17 View view = (View) inflater.inflate(R.layout.content_fragment, 18 container, false); 19 return view; 20 } 21 22 @Override 23 public void onStart() { 24 super.onStart(); 25 System.out.println("ContentFragment----->>onStart()"); 26 } 27 28 @Override 29 public void onResume() { 30 31 super.onResume(); 32 System.out.println("ContentFragment----->>onResume()"); 33 } 34 35 }
ContentFragment所引用的xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:gravity="center" 6 android:orientation="vertical" > 7 8 <TextView 9 android:id="@+id/content" 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 android:gravity="center" 13 android:text="內容頁" /> 14 15 </LinearLayout>
運行後的效果:
點擊按鈕顯示對應的頁數.
在看看打印出來數據:能夠了解到activity和fragment的生命週期是有前後順序的。
Activity的onCreate()------>>fragment的Attach()---->>fragment的onCreate()------>>fragment的onCreateView()--->>(在多個fragment的onCreateView()執行完後,就又開始執行每一個fragment的
onStart())----->>Activity的onStart() ----->>Activity的onResume() ------>>fragment的onResume()
由於在onCreate()當中不能得到fragment的中的控件,由於要等fragement執行了onCreateView()後才能獲取,因此只能在onCreateView()後的Activity的生命函數當中才能對fragment的控件進行實例化