Fragment->Fragment生命周期

生命周期图

  • Activity生命周期图
    在这里插入图片描述

  • Fragment生命周期图

在这里插入图片描述

XML文件

  • Activity 布局文件R.layout.activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/replace_child_ll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_green_light"
    android:gravity="center"
    android:orientation="vertical">
</LinearLayout>
  • 第一次添加的MyFragmentA布局R.layout.inflate_layout_a
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/inflate_tv_a"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@android:color/holo_blue_light" />
  • 第二次添加的MyFragmentB布局R.layout.inflate_layout_b
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/inflate_tv_b"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@android:color/holo_orange_light"/>

Activity代码和Fragment代码

  • MyFragmentA代码
class MyFragmentA : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
    	Log.d(TAG, "$this onCreateView container = $container")
        return inflater.inflate(R.layout.inflate_layout_a, container, false)
    }
}
  • MyFragmentB代码
class MyFragmentB : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
	    Log.d(TAG, "$this onCreateView container = $container")
        return inflater.inflate(R.layout.inflate_layout_b, container, false)
    }
}

replace方式添加+不使用addToBackStack

  • 添加MyFragmentA之后,立马添加MyFragmentBMyFragmentAonStart()onResume()不会执行
  • replace方式添加+不使用addToBackStack,会销毁之前添加的MyFragmentA,执行到其onDetach()
const val TAG = "Yang"
class MainActivity : AppCompatActivity() {
    var replaceLl : LinearLayout? = null
    var mMainHandler = Handler(Looper.getMainLooper())
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "$this onCreate")
        setContentView(R.layout.activity_main)
        replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout
        // 添加第一个Fragment
        val firstFragment = MyFragmentA()
        replaceLl?.let {
            replaceFragmentNoToStack(firstFragment, it)
        }

        // 添加第二个Fragment
        val secondFragment = MyFragmentB()
        replaceLl?.let {
            replaceFragmentNoToStack(secondFragment, it)
        }
    }

    private fun replaceFragmentNoToStack(fragment: Fragment, targetView: View) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction?.replace(targetView.id, fragment)
            ?.commitAllowingStateLoss()
    }
}

// log
2024-06-07 07:43:45.623 21871-21871 Yang          D  com.gallery20.app.MainActivity@7240041 onCreate
2024-06-07 07:43:45.659 21871-21871 Yang          D  MyFragmentA{7f1f6e7} (5a52096d-ad24-4225-9c8f-44c8f5820fa5 id=0x7f0a0585) onAttach
2024-06-07 07:43:45.660 21871-21871 Yang          D  MyFragmentA{7f1f6e7} (5a52096d-ad24-4225-9c8f-44c8f5820fa5 id=0x7f0a0585) onCreate
2024-06-07 07:43:45.660 21871-21871 Yang          D  MyFragmentA{7f1f6e7} (5a52096d-ad24-4225-9c8f-44c8f5820fa5 id=0x7f0a0585) onCreateView container = android.widget.LinearLayout{40a6400 V.E...... ......ID 0,0-0,0 #7f0a0585 app:id/replace_child_ll}
2024-06-07 07:43:45.665 21871-21871 Yang          D  MyFragmentA{7f1f6e7} (5a52096d-ad24-4225-9c8f-44c8f5820fa5 id=0x7f0a0585) onViewCreated
2024-06-07 07:43:45.666 21871-21871 Yang          D  MyFragmentA{7f1f6e7} (5a52096d-ad24-4225-9c8f-44c8f5820fa5 id=0x7f0a0585) onActivityCreated
2024-06-07 07:43:45.667 21871-21871 Yang          D  MyFragmentB{e69e8c4} (b77b689d-be65-45a4-91bf-4197ea42b2c8 id=0x7f0a0585) onAttach
2024-06-07 07:43:45.667 21871-21871 Yang          D  MyFragmentB{e69e8c4} (b77b689d-be65-45a4-91bf-4197ea42b2c8 id=0x7f0a0585) onCreate
2024-06-07 07:43:45.668 21871-21871 Yang          D  MyFragmentB{e69e8c4} (b77b689d-be65-45a4-91bf-4197ea42b2c8 id=0x7f0a0585) onCreateView container = android.widget.LinearLayout{40a6400 V.E...... ......ID 0,0-0,0 #7f0a0585 app:id/replace_child_ll}
2024-06-07 07:43:45.669 21871-21871 Yang          D  MyFragmentB{e69e8c4} (b77b689d-be65-45a4-91bf-4197ea42b2c8 id=0x7f0a0585) onViewCreated
2024-06-07 07:43:45.669 21871-21871 Yang          D  MyFragmentB{e69e8c4} (b77b689d-be65-45a4-91bf-4197ea42b2c8 id=0x7f0a0585) onActivityCreated
2024-06-07 07:43:45.670 21871-21871 Yang          D  MyFragmentA{7f1f6e7} (5a52096d-ad24-4225-9c8f-44c8f5820fa5 id=0x7f0a0585) onDestroyView
2024-06-07 07:43:45.671 21871-21871 Yang          D  MyFragmentA{7f1f6e7} (5a52096d-ad24-4225-9c8f-44c8f5820fa5 id=0x7f0a0585) onDestroy
2024-06-07 07:43:45.671 21871-21871 Yang          D  MyFragmentA{7f1f6e7} (5a52096d-ad24-4225-9c8f-44c8f5820fa5 id=0x7f0a0585) onDetach
2024-06-07 07:43:45.671 21871-21871 Yang          D  MyFragmentB{e69e8c4} (b77b689d-be65-45a4-91bf-4197ea42b2c8 id=0x7f0a0585) onStart
2024-06-07 07:43:45.672 21871-21871 Yang          D  com.gallery20.app.MainActivity@7240041 onStart
2024-06-07 07:43:45.678 21871-21871 Yang          D  com.gallery20.app.MainActivity@7240041 onResume
2024-06-07 07:43:45.678 21871-21871 Yang          D  MyFragmentB{e69e8c4} (b77b689d-be65-45a4-91bf-4197ea42b2c8 id=0x7f0a0585) onResume

replace方式添加+使用addToBackStack

  • 添加MyFragmentA之后,立马添加MyFragmentBMyFragmentAonStart()onResume()不会执行
  • replace方式添加+不使用addToBackStack,不会销毁之前添加的MyFragmentA,但会执行到其onDestroyView()
class MainActivity : AppCompatActivity() {
    var replaceLl : LinearLayout? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "$this onCreate")
        setContentView(R.layout.activity_main)
        replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout
        // 添加第一个Fragment
        val firstFragment = MyFragmentA()
        replaceLl?.let {
            replaceFragmentAddToStack(firstFragment, it)
        }

        // 添加第二个Fragment
        val secondFragment = MyFragmentB()
        replaceLl?.let {
            replaceFragmentAddToStack(secondFragment, it)
        }
    }

    private fun replaceFragmentAddToStack(fragment: Fragment, targetView: View) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction?.replace(targetView.id, fragment)
            ?.addToBackStack(null)
            ?.commitAllowingStateLoss()
    }


// log
2024-06-07 07:50:52.706 22310-22310 Yang            D  com.gallery20.app.MainActivity@9d07a5e onCreate
2024-06-07 07:50:52.742 22310-22310 Yang            D  MyFragmentA{7f1f6e7} (107dd6f0-3556-4485-a5fb-b3eba130d64a id=0x7f0a0585) onAttach
2024-06-07 07:50:52.743 22310-22310 Yang            D  MyFragmentA{7f1f6e7} (107dd6f0-3556-4485-a5fb-b3eba130d64a id=0x7f0a0585) onCreate
2024-06-07 07:50:52.743 22310-22310 Yang            D  MyFragmentA{7f1f6e7} (107dd6f0-3556-4485-a5fb-b3eba130d64a id=0x7f0a0585) onCreateView container = android.widget.LinearLayout{40a6400 V.E...... ......ID 0,0-0,0 #7f0a0585 app:id/replace_child_ll}
2024-06-07 07:50:52.748 22310-22310 Yang            D  MyFragmentA{7f1f6e7} (107dd6f0-3556-4485-a5fb-b3eba130d64a id=0x7f0a0585) onViewCreated
2024-06-07 07:50:52.749 22310-22310 Yang            D  MyFragmentA{7f1f6e7} (107dd6f0-3556-4485-a5fb-b3eba130d64a id=0x7f0a0585) onActivityCreated
2024-06-07 07:50:52.750 22310-22310 Yang            D  MyFragmentB{e69e8c4} (350db1e1-ec05-442b-992b-565bbf505172 id=0x7f0a0585) onAttach
2024-06-07 07:50:52.751 22310-22310 Yang            D  MyFragmentB{e69e8c4} (350db1e1-ec05-442b-992b-565bbf505172 id=0x7f0a0585) onCreate
2024-06-07 07:50:52.751 22310-22310 Yang            D  MyFragmentB{e69e8c4} (350db1e1-ec05-442b-992b-565bbf505172 id=0x7f0a0585) onCreateView container = android.widget.LinearLayout{40a6400 V.E...... ......ID 0,0-0,0 #7f0a0585 app:id/replace_child_ll}
2024-06-07 07:50:52.753 22310-22310 Yang            D  MyFragmentB{e69e8c4} (350db1e1-ec05-442b-992b-565bbf505172 id=0x7f0a0585) onViewCreated
2024-06-07 07:50:52.753 22310-22310 Yang            D  MyFragmentB{e69e8c4} (350db1e1-ec05-442b-992b-565bbf505172 id=0x7f0a0585) onActivityCreated
2024-06-07 07:50:52.753 22310-22310 Yang            D  MyFragmentA{7f1f6e7} (107dd6f0-3556-4485-a5fb-b3eba130d64a id=0x7f0a0585) onDestroyView
2024-06-07 07:50:52.754 22310-22310 Yang            D  MyFragmentB{e69e8c4} (350db1e1-ec05-442b-992b-565bbf505172 id=0x7f0a0585) onStart
2024-06-07 07:50:52.755 22310-22310 Yang            D  com.gallery20.app.MainActivity@9d07a5e onStart
2024-06-07 07:50:52.757 22310-22310 Yang            D  com.gallery20.app.MainActivity@9d07a5e onResume
2024-06-07 07:50:52.758 22310-22310 Yang            D  MyFragmentB{e69e8c4} (350db1e1-ec05-442b-992b-565bbf505172 id=0x7f0a0585) onResume

add方式添加+不使用addToBackStack

  • 添加MyFragmentA之后,立马添加MyFragmentB,两个FragmentonStart()onResume()都会执行
  • add方式添加+不使用addToBackStack,不会销毁之前添加的MyFragmentA
class MainActivity : AppCompatActivity() {
    var replaceLl : LinearLayout? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "$this onCreate")
        setContentView(R.layout.activity_main)
        replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout
        // 添加第一个Fragment
        val firstFragment = MyFragmentA()
        replaceLl?.let {
            addFragmentNoToStack(firstFragment, it)
        }

        // 添加第二个Fragment
        val secondFragment = MyFragmentB()
        replaceLl?.let {
            addFragmentNoToStack(secondFragment, it)
        }
    }
    
    private fun addFragmentNoToStack(fragment: Fragment, targetView: View) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction?.add(targetView.id, fragment)
            ?.commitAllowingStateLoss()
    }
}

// log
2024-06-07 07:58:30.925 22967-22967 Yang        D  com.gallery20.app.MainActivity@9d07a5e onCreate
2024-06-07 07:58:30.961 22967-22967 Yang        D  MyFragmentA{7f1f6e7} (74858be9-9c26-4df2-a002-5d7b04638a3f id=0x7f0a0585) onAttach
2024-06-07 07:58:30.961 22967-22967 Yang        D  MyFragmentA{7f1f6e7} (74858be9-9c26-4df2-a002-5d7b04638a3f id=0x7f0a0585) onCreate
2024-06-07 07:58:30.962 22967-22967 Yang        D  MyFragmentA{7f1f6e7} (74858be9-9c26-4df2-a002-5d7b04638a3f id=0x7f0a0585) onCreateView container = android.widget.LinearLayout{40a6400 V.E...... ......ID 0,0-0,0 #7f0a0585 app:id/replace_child_ll}
2024-06-07 07:58:30.967 22967-22967 Yang        D  MyFragmentA{7f1f6e7} (74858be9-9c26-4df2-a002-5d7b04638a3f id=0x7f0a0585) onViewCreated
2024-06-07 07:58:30.968 22967-22967 Yang        D  MyFragmentA{7f1f6e7} (74858be9-9c26-4df2-a002-5d7b04638a3f id=0x7f0a0585) onActivityCreated
2024-06-07 07:58:30.969 22967-22967 Yang        D  MyFragmentB{29067d7} (d8fdbdc9-cfae-4c03-813c-0611540934ea id=0x7f0a0585) onAttach
2024-06-07 07:58:30.969 22967-22967 Yang        D  MyFragmentB{29067d7} (d8fdbdc9-cfae-4c03-813c-0611540934ea id=0x7f0a0585) onCreate
2024-06-07 07:58:30.969 22967-22967 Yang        D  MyFragmentB{29067d7} (d8fdbdc9-cfae-4c03-813c-0611540934ea id=0x7f0a0585) onCreateView container = android.widget.LinearLayout{40a6400 V.E...... ......ID 0,0-0,0 #7f0a0585 app:id/replace_child_ll}
2024-06-07 07:58:30.971 22967-22967 Yang        D  MyFragmentB{29067d7} (d8fdbdc9-cfae-4c03-813c-0611540934ea id=0x7f0a0585) onViewCreated
2024-06-07 07:58:30.971 22967-22967 Yang        D  MyFragmentB{29067d7} (d8fdbdc9-cfae-4c03-813c-0611540934ea id=0x7f0a0585) onActivityCreated
2024-06-07 07:58:30.972 22967-22967 Yang        D  MyFragmentA{7f1f6e7} (74858be9-9c26-4df2-a002-5d7b04638a3f id=0x7f0a0585) onStart
2024-06-07 07:58:30.972 22967-22967 Yang        D  MyFragmentB{29067d7} (d8fdbdc9-cfae-4c03-813c-0611540934ea id=0x7f0a0585) onStart
2024-06-07 07:58:30.972 22967-22967 Yang        D  com.gallery20.app.MainActivity@9d07a5e onStart
2024-06-07 07:58:30.975 22967-22967 Yang        D  com.gallery20.app.MainActivity@9d07a5e onResume
2024-06-07 07:58:30.975 22967-22967 Yang        D  MyFragmentA{7f1f6e7} (74858be9-9c26-4df2-a002-5d7b04638a3f id=0x7f0a0585) onResume
2024-06-07 07:58:30.975 22967-22967 Yang        D  MyFragmentB{29067d7} (d8fdbdc9-cfae-4c03-813c-0611540934ea id=0x7f0a0585) onResume

add方式添加+使用addToBackStack

  • 添加MyFragmentA之后,立马添加MyFragmentB,两个FragmentonStart()onResume()都会执行
  • add方式添加+使用addToBackStack,不会销毁之前添加的MyFragmentA
class MainActivity : AppCompatActivity() {
    var replaceLl : LinearLayout? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "$this onCreate")
        setContentView(R.layout.activity_main)
        replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout
        // 添加第一个Fragment
        val firstFragment = MyFragmentA()
        replaceLl?.let {
            addFragmentAddToStack(firstFragment, it)
        }

        // 添加第二个Fragment
        val secondFragment = MyFragmentB()
        replaceLl?.let {
            addFragmentAddToStack(secondFragment, it)
        }
    }

    private fun addFragmentAddToStack(fragment: Fragment, targetView: View) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction?.add(targetView.id, fragment)
            ?.addToBackStack(null)
            ?.commitAllowingStateLoss()
    }
}

// log
2024-06-07 08:13:20.982 23469-23469 Yang            D  com.gallery20.app.MainActivity@9d07a5e onCreate
2024-06-07 08:13:21.020 23469-23469 Yang            D  MyFragmentA{4408346} (87686993-59a0-4790-9492-7747e0f75cfe id=0x7f0a0585) onAttach
2024-06-07 08:13:21.020 23469-23469 Yang            D  MyFragmentA{4408346} (87686993-59a0-4790-9492-7747e0f75cfe id=0x7f0a0585) onCreate
2024-06-07 08:13:21.020 23469-23469 Yang            D  MyFragmentA{4408346} (87686993-59a0-4790-9492-7747e0f75cfe id=0x7f0a0585) onCreateView container = android.widget.LinearLayout{6fb8ea3 V.E...... ......ID 0,0-0,0 #7f0a0585 app:id/replace_child_ll}
2024-06-07 08:13:21.025 23469-23469 Yang            D  MyFragmentA{4408346} (87686993-59a0-4790-9492-7747e0f75cfe id=0x7f0a0585) onViewCreated
2024-06-07 08:13:21.026 23469-23469 Yang            D  MyFragmentA{4408346} (87686993-59a0-4790-9492-7747e0f75cfe id=0x7f0a0585) onActivityCreated
2024-06-07 08:13:21.027 23469-23469 Yang            D  MyFragmentB{1d649f6} (549ece5d-1a51-4c62-893b-e475b4ee59ef id=0x7f0a0585) onAttach
2024-06-07 08:13:21.028 23469-23469 Yang            D  MyFragmentB{1d649f6} (549ece5d-1a51-4c62-893b-e475b4ee59ef id=0x7f0a0585) onCreate
2024-06-07 08:13:21.028 23469-23469 Yang            D  MyFragmentB{1d649f6} (549ece5d-1a51-4c62-893b-e475b4ee59ef id=0x7f0a0585) onCreateView container = android.widget.LinearLayout{6fb8ea3 V.E...... ......ID 0,0-0,0 #7f0a0585 app:id/replace_child_ll}
2024-06-07 08:13:21.030 23469-23469 Yang            D  MyFragmentB{1d649f6} (549ece5d-1a51-4c62-893b-e475b4ee59ef id=0x7f0a0585) onViewCreated
2024-06-07 08:13:21.030 23469-23469 Yang            D  MyFragmentB{1d649f6} (549ece5d-1a51-4c62-893b-e475b4ee59ef id=0x7f0a0585) onActivityCreated
2024-06-07 08:13:21.030 23469-23469 Yang            D  MyFragmentA{4408346} (87686993-59a0-4790-9492-7747e0f75cfe id=0x7f0a0585) onStart
2024-06-07 08:13:21.031 23469-23469 Yang            D  MyFragmentB{1d649f6} (549ece5d-1a51-4c62-893b-e475b4ee59ef id=0x7f0a0585) onStart
2024-06-07 08:13:21.031 23469-23469 Yang            D  com.gallery20.app.MainActivity@9d07a5e onStart
2024-06-07 08:13:21.033 23469-23469 Yang            D  com.gallery20.app.MainActivity@9d07a5e onResume
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值