Fragment進階

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的控件進行實例化

相關文章
相關標籤/搜索