iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
Mobile Development

Android與Spring Boot開發學習之旅系列 第 2

開發學習之旅 Day2 - Fragment生命週期

  • 分享至 

  • xImage
  •  

Fragment是Android應用程式中的一部分,在同一個Activity中實現模組化和可重用的UI元件,可以將Fragment視為Activity內的小部件,將多個Fragment組合在一個Activity中。

了解Fragment的生命週期可以更有效地管理Fragment的操作、UI和資料。

onAttach

當Fragment與Activity關聯時。此方法被調用。您可以在這裡執行初始化操作,例如設置與Activity的連接或獲取Activity提供的資源。

onCreate

當Fragment正在被創建時,通常執行與Fragment的初始化相關的操作。

onCreateView

此方法用於創建Fragment的UI元素,它返回Fragment綁定的View。在這裡,您應該載入佈局資源文件並初始化UI元素。

onActivityCreated

此階段初始化Fragment的UI元件和執行與UI相關的操作,用於創建和配置Fragment的可見部分。

onStart

Fragment即將可見,這個階段執行與Fragment可見性相關的操作,可以在這邊開始動畫或更新UI。

onResume

開始執行需要與使用者交互的操作,像是監控使用者操作與動態更新UI。

onPause

當Fragment即將失去焦點時,此階段應暫停或停止與使用者交互的操作,並執行一些清理工作。

onStop

當Fragment變得不可見時,在這個階段,應該要釋放不需要的資源,停止執行任何消耗資源的操作。

onDestroyView

在Fragment的UI元件將被移除之前,此階段應該釋放UI相關資源。

onDestroy

執行任何需要在Fragment銷毀之前進行的清理操作,如關閉數據庫連接或停止後台服務。

onDetach

當Fragment從Activity中分離時,執行最後的清理操作,通常是釋放對Activity的引用。


在不同生命週期方法中使用Log於Android Fragment中記錄生命週期狀態:

在activity_main.xml中創建一個FrameLayout佈局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

創建一個Fragment類(MyFragment、fragment_my.xml),並實現所有的生命週期方法以及Log訊息:

public class MyFragment extends Fragment {
    private static final String TAG = "MyFragment";

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        Log.d(TAG, "onAttach");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView");
        return inflater.inflate(R.layout.fragment_my, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d(TAG, "onActivityCreated");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d(TAG, "onDestroyView");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d(TAG, "onDetach");
    }
}

在MainActivity中將Fragment添加到Activity中:

public class MainActivity extends AppCompatActivity {

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

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, new MyFragment())
                .commit();

    }
}

上一篇
開發學習之旅 Day1 - Android生命週期
下一篇
開發學習之旅 Day3 - 記帳應用簡介
系列文
Android與Spring Boot開發學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言