Board logo

標題: Fragment [打印本頁]

作者: tonyh    時間: 2017-12-23 14:27     標題: Fragment

本帖最後由 tonyh 於 2018-1-13 14:58 編輯

什麼是Fragment

Fragment (中譯:片段、區塊) 是Android提供的一個畫面區塊,可將Fragment放在一個Activity中,可使用多個Fragment構成一個手機畫面。因此,Fragment是Activity的子畫面,如下圖:

[attach]3184[/attach]

在Activity中的每個Fragment擁有自己的生命週期,當Activity進入暫停時,Activity內的Fragment也會自動執行相對的生命週期方法,在Fragment中覆寫這些方法,可自訂區塊的功能設計。例如,何時要重新讀取資料、何時暫停處理資料等。

在2009年Android剛嶄露頭角時,手機的畫面不大,解析度也不高,一個畫面放不了太多資訊,因此使用Activity轉換到另一個Activity的方式來設計功能,如下圖:

[attach]3183[/attach]

像是在Activity1中顯示消費清單,當按下清單中的其中一個項目時,在Activity2顯示該筆消費的詳細資訊。

但從2010年時平板開始流行後,畫面變大、解析度變高,一個畫面可容納更多的元件了,2011年初Android 3.0推出時,即加入了Fragment元件,可在Activity中加入Fragment區塊,使其可在一個畫面下容納多個區塊的顯示,並自訂每個區塊的內容,或者更換其中一個區塊功能。

Fragment的生命週期

每個Fragment擁有自己的生命週期,也就是說,在特定的狀況會自動呼叫特定的方法,供使用者依功能需求覆寫這些方法,加入必要的程式碼。依照Fragment產生與出現的順序會執行的方法描述如下:

產生階段(未出現在畫面上)

onAttach()
當Fragment被加到某個Activity畫面中時,會自動呼叫此方法。

onCreate()
Fragment被建立時會自動呼叫此方法,可加入初始化元件或資料的程式碼。

onCreateView()
將在畫面中第一次顯示Fragment時會自動呼叫此方法,必須回傳Fragment畫面的View元件,設計時,請使用方法中的LayoutInflater物件,在此方法中產生畫面元件並回傳。

onActivityCreated()
當加入本Fragment的Activity被建立時,該Activity的onCreate方法執行完成後,會自動執行此方法。執行完此方法後,Fragment才出現在畫面上。

準備階段(出現在畫面上)

onStart()
當Fragment出現在畫面中時先執行此方法。

onResume()
執行完onStart方法後,再自動執行本方法。完成後即在畫面中與使用者互動。

暫停階段

當使用者按下返回鍵,或是程式中將Fragment自某個Activity中移除時,會自動執行以下方法:

onPause()
進入暫停前第一個執行的方法。

onStop()
執行完onPause方法後,自動執行本方法。

onDestroyView()
此時Fragment已不在畫面中,呼叫此方法。

onDestroy()
當Fragment要被清除之前,會執行此方法。

onDetach()
與當初被加入的Activity卸載時,會自動執行此方法。

實作Fragment

完成如下圖所示之練習,頁面上方為兩個按鈕,下方為一個 FrameLayout,點擊按鈕後將 FrameLayout 中的內容置換為目標子頁面。

[attach]3190[/attach]

[attach]3191[/attach]

[attach]3192[/attach]
layout\activity_main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     tools:context=".MainActivity"
  6.     android:orientation="vertical">

  7.     <LinearLayout
  8.         android:orientation="horizontal"
  9.         android:layout_width="match_parent"
  10.         android:layout_height="wrap_content"
  11.         android:layout_gravity="center_horizontal">

  12.         <Button
  13.             android:layout_width="fill_parent"
  14.             android:layout_height="wrap_content"
  15.             android:text="Fragment1"
  16.             android:id="@+id/button1"
  17.             android:textAllCaps="false"
  18.             android:textSize="20sp"
  19.             android:layout_weight="1" />

  20.         <Button
  21.             android:layout_width="fill_parent"
  22.             android:layout_height="wrap_content"
  23.             android:text="Fragment2"
  24.             android:id="@+id/button2"
  25.             android:layout_gravity="center_horizontal"
  26.             android:textAllCaps="false"
  27.             android:textSize="20sp"
  28.             android:layout_weight="1" />
  29.     </LinearLayout>

  30.     <FrameLayout
  31.         android:layout_width="fill_parent"
  32.         android:layout_height="0dp"
  33.         android:layout_weight="1"
  34.         android:id="@+id/frame"
  35.         android:visibility="visible"></FrameLayout>
  36. </LinearLayout>
複製代碼
layout\fragment1.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical" android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:background="#c0e6ff">

  6.     <TextView
  7.         android:layout_width="match_parent"
  8.         android:layout_height="match_parent"
  9.         android:text="This is Fragment1"
  10.         android:id="@+id/textView"
  11.         android:layout_gravity="center_horizontal"
  12.         android:gravity="center"
  13.         android:textSize="28sp"
  14.         android:textColor="@android:color/black"
  15.         android:background="#c8e9ff"
  16.         android:visibility="visible" />
  17. </LinearLayout>
複製代碼
layout\fragment2.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical" android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:background="#ffc7c7">

  6.     <TextView
  7.         android:layout_width="match_parent"
  8.         android:layout_height="match_parent"
  9.         android:text="This is Fragment2"
  10.         android:id="@+id/textView"
  11.         android:layout_gravity="center_horizontal"
  12.         android:gravity="center"
  13.         android:textSize="28sp"
  14.         android:textColor="@android:color/black"
  15.         android:background="#f7d1ff"
  16.         android:visibility="visible" />
  17. </LinearLayout>
複製代碼
MainActivity.java
  1. package org.istak.ch38_fragment;

  2. import android.app.FragmentTransaction;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;

  7. public class MainActivity extends AppCompatActivity {

  8.     Button btn1, btn2;

  9.     @Override
  10.     protected void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.activity_main);

  13.         btn1 = (Button) findViewById(R.id.button1);
  14.         btn2 = (Button) findViewById(R.id.button2);

  15.         btn1.setOnClickListener(new View.OnClickListener() {
  16.             @Override
  17.             public void onClick(View v) {
  18.                 //FragmentManager fm = getFragmentManager();
  19.                 Fragment1 f1 = new Fragment1();
  20.                 FragmentTransaction ft = getFragmentManager().beginTransaction();
  21.                 ft.add(R.id.frame, f1);    //replace() 具同樣效果
  22.                 //ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);  //設轉場動畫 (無意義)
  23.                 ft.commit();
  24.             }
  25.         });
  26.         btn2.setOnClickListener(new View.OnClickListener() {
  27.             @Override
  28.             public void onClick(View v) {
  29.                 //Fragment2 f2 = new Fragment2();
  30.                 //FragmentTransaction ft = getFragmentManager().beginTransaction();
  31.                 //ft.add(R.id.frame_layout, f2);
  32.                 //ft.commit();
  33.                 getFragmentManager().beginTransaction().add(R.id.frame, new Fragment2()).commit();
  34.             }
  35.         });
  36.     }
  37. }
複製代碼
Fragment1.java
  1. package org.istak.ch38_fragment;

  2. import android.app.Fragment;
  3. import android.os.Bundle;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;

  7. /**
  8. * Created by Tony on 2017/11/14.
  9. */
  10. public class Fragment1 extends Fragment {

  11.     @Override
  12.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  13.         View v=inflater.inflate(R.layout.fragment1,container,false);
  14.         return v;
  15.     }
  16. }
複製代碼
Fragment2.java
  1. package org.istak.ch38_fragment;

  2. import android.app.Fragment;
  3. import android.os.Bundle;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;

  7. /**
  8. * Created by Tony on 2017/11/14.
  9. */
  10. public class Fragment2 extends Fragment {

  11.     @Override
  12.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  13.         View v=inflater.inflate(R.layout.fragment2,container,false);
  14.         return v;
  15.     }
  16. }
複製代碼

作者: 李允軒    時間: 2017-12-23 17:57

本帖最後由 李允軒 於 2017-12-23 17:58 編輯
  1. package com.example.student.myapplication;

  2. import android.app.Fragment;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;

  7. public class MainActivity extends AppCompatActivity {
  8.     Button bt1,bt2;
  9.     @Override
  10.     protected void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.activity_main);

  13.         bt1= (Button) findViewById(R.id.button);
  14.         bt2= (Button) findViewById(R.id.button2);

  15.         bt1.setOnClickListener(new View.OnClickListener() {
  16.             @Override
  17.             public void onClick(View v) {
  18.                 getFragmentManager().beginTransaction().add(R.id.frame,new fragment1()).commit();
  19.             }
  20.         });
  21.         bt2.setOnClickListener(new View.OnClickListener() {
  22.             @Override
  23.             public void onClick(View v) {
  24.                 getFragmentManager().beginTransaction().add(R.id.frame, new fragment2()).commit();
  25.             }
  26.         });
  27.     }
  28. }
複製代碼
  1. package com.example.student.myapplication;

  2. import android.app.Fragment;
  3. import android.os.Bundle;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;

  7. /**
  8. * Created by student on 2017/12/23.
  9. */
  10. public class fragment1 extends Fragment{

  11.     @Override
  12.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  13.         View v=inflater.inflate(R.layout.fragment1,container,false);
  14.         return v;

  15.     }
  16. }
複製代碼
  1. package com.example.student.myapplication;

  2. import android.app.Fragment;
  3. import android.os.Bundle;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;

  7. /**
  8. * Created by student on 2017/12/23.
  9. */
  10. public class fragment2 extends Fragment{
  11.     @Override
  12.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  13.         View v=inflater.inflate(R.layout.fragment2,container,false);
  14.         return v;
  15.     }
  16. }
複製代碼

作者: 林宇翔    時間: 2018-1-6 12:26

  1. package com.example.student.myapplication;

  2. import android.app.Fragment;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;

  7. public class MainActivity extends AppCompatActivity {
  8.     Button bt1,bt2;
  9.     @Override
  10.     protected void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.activity_main);

  13.         bt1= (Button) findViewById(R.id.button);
  14.         bt2= (Button) findViewById(R.id.button2);

  15.         bt1.setOnClickListener(new View.OnClickListener() {
  16.             @Override
  17.             public void onClick(View v) {
  18.                 getFragmentManager().beginTransaction().add(R.id.frame,new fragment1()).commit();
  19.             }
  20.         });
  21.         bt2.setOnClickListener(new View.OnClickListener() {
  22.             @Override
  23.             public void onClick(View v) {
  24.                 getFragmentManager().beginTransaction().add(R.id.frame, new fragment2()).commit();
  25.             }
  26.         });
  27.     }
  28. }
  29. package com.example.student.myapplication;

  30. import android.app.Fragment;
  31. import android.os.Bundle;
  32. import android.view.LayoutInflater;
  33. import android.view.View;
  34. import android.view.ViewGroup;

  35. /**
  36. * Created by student on 2018/01/06.
  37. */
  38. public class fragment1 extends Fragment{

  39.     @Override
  40.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  41.         View v=inflater.inflate(R.layout.fragment1,container,false);
  42.         return v;

  43.     }
  44. }
  45. package com.example.student.myapplication;

  46. import android.app.Fragment;
  47. import android.os.Bundle;
  48. import android.view.LayoutInflater;
  49. import android.view.View;
  50. import android.view.ViewGroup;

  51. /**
  52. * Created by student on 2018/01/06.
  53. */
  54. public class fragment2 extends Fragment{
  55.     @Override
  56.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  57.         View v=inflater.inflate(R.layout.fragment2,container,false);
  58.         return v;
  59.     }
  60. }
複製代碼





歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/) Powered by Discuz! 7.2