Android Fragment生命周期介绍!

无论您是准备面试还是要在应用程序中实现片段,您都应该了解片段的生命周期。

我们大多数人都非常了解android活动生命周期,但还不了解片段生命周期。

片段生命周期如何与活动生命周期相互作用? 添加片段与替换片段有什么区别?

我们将在下面查看所有这些问题。

Android片段生命周期

android中的片段生命周期主要由以下8种方法组成:

  1. onCreate :用于初始化非图形组件。
  2. onCreateView :用于扩大片段的xml布局。
  3. onStart
  4. onResume
  5. 暂停
  6. onStop
  7. onDestroyView
  8. onDestroy

这些构成了Android中的片段生命周期。 为了研究他们的通话顺序,我创建了一个示例项目。

创建一个示例应用

我们将以两种方式分析片段的生命周期。 首先通过动态添加片段,然后静态添加。

在Android Studio中创建一个新项目。 这将是一个基础项目,我们将在所有生命周期方法中添加基本日志语句。

在该项目中,添加一个名为LifecycleFragment的片段并覆盖生命周期方法。 如果尚未创建,请创建一个简单的布局xml。

 class LifecycleFragment : Fragment() { 
    var LOG_TAG = "Androidville" 
    companion object {

        @JvmStatic

        fun newInstance() = LifecycleFragment()

    }

    override fun onCreate(savedInstanceState: Bundle?) {

        super .onCreate(savedInstanceState)

        Log.d(LOG_TAG, "LifecycleFragment: onCreate() called" )

    }

    override fun onCreateView(

        inflater: LayoutInflater, container: ViewGroup?,

        savedInstanceState: Bundle?

    ): View? {

        Log.d(LOG_TAG, "LifecycleFragment: onCreateView() called" )

        return inflater.inflate(R.layout.fragment_lifecycle, container, false )

    }

    override fun onStart() {

        Log.d(LOG_TAG, "LifecycleFragment: onStart() called" )

        super .onStart()

    }

    override fun onResume() {

        Log.d(LOG_TAG, "LifecycleFragment: onResume() called" )

        super .onResume()

    }

    override fun onPause() {

        Log.d(LOG_TAG, "LifecycleFragment: onPause() called" )

        super .onPause()

    }

    override fun onStop() {

        Log.d(LOG_TAG, "LifecycleFragment: onStop() called" )

        super .onStop()

    }

    override fun onDestroy() {

        Log.d(LOG_TAG, "LifecycleFragment: onDestroy() called" )

        super .onDestroy()

    }

    override fun onDestroyView() {

        Log.d(LOG_TAG, "LifecycleFragment: onDestroyView() called" )

        super .onDestroyView()

    }
 }

您会注意到我在所有这些方法中都添加了log语句,这将有助于我识别调用顺序。

这是布局文件:

 <?xml version= "1.0" encoding= "utf-8" ?>
 <RelativeLayout xmlns:android= " http://schemas.android.com/apk/res/android "

    xmlns:tools= " http://schemas.android.com/tools "

    android:layout_width= "match_parent"

    android:layout_height= "match_parent"

    tools:context= ".LifecycleFragment" > 
    <TextView

        android:layout_width= "wrap_content"

        android:layout_height= "wrap_content"

        android:layout_centerInParent= "true"

        android:text= "Hello from Fragment!" />
 </RelativeLayout>

动态添加片段

以下是MainActivity.kt可以动态添加片段的代码:

 MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {

    var TAG: String = "ANDROIDVILLE"

    var LOG_TAG = "Androidville" 
    override fun onCreate(savedInstanceState: Bundle?) {

        super .onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        Log.d(LOG_TAG, "MainActivity: onCreate() called" )

        setupFragment()

    }

    private fun setupFragment() {

        supportFragmentManager.beginTransaction()

                .add(R.id.contentFrame, LifecycleFragment.newInstance(), TAG)

                .commit()

    }

    override fun onRestart() {

        Log.d(LOG_TAG, "MainActivity: onRestart() called" )

        super .onRestart()

    }

    override fun onStart() {

        Log.d(LOG_TAG, "MainActivity: onStart() called" )

        super .onStart()

    }

    override fun onResume() {

        Log.d(LOG_TAG, "MainActivity: onResume() called" )

        super .onResume()

    }

    override fun onPause() {

        Log.d(LOG_TAG, "MainActivity: onPause() called" )

        super .onPause()

    }

    override fun onStop() {

        Log.d(LOG_TAG, "MainActivity: onStop() called" )

        super .onStop()

    }

    override fun onDestroy() {

        Log.d(LOG_TAG, "MainActivity: onDestroy() called" )

        super .onDestroy()

    }
 }

这是布局activity_main.xml

 <?xml version= "1.0" encoding= "utf-8" ?>
 <RelativeLayout 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/contentFrame"

        android:layout_width= "match_parent"

        android:layout_height= "wrap_content" />
 </RelativeLayout>

静态添加片段

要静态添加片段,我们只需在activity_main.xml文件中添加<fragment>元素,并将其名称设置为kotlin类。布局:

 <?xml version= "1.0" encoding= "utf-8" ?>
 <RelativeLayout xmlns:android= " http://schemas.android.com/apk/res/android "

    xmlns:tools= " http://schemas.android.com/tools "

    android:layout_width= "match_parent"

    android:layout_height= "match_parent"

    tools:context= ".MainActivity" > 
    <fragment

        android:id= "@+id/lifecycle_fragment"

        android:name= "com.example.androidfragmentlifecycleexample.LifecycleFragment"

        android:layout_width= "match_parent"

        android:layout_height= "match_parent" />
 </RelativeLayout>

MainActivity.kt文件:

 MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {

    var TAG: String = "ANDROIDVILLE"

    var LOG_TAG = "Androidville" 
    override fun onCreate(savedInstanceState: Bundle?) {

        super .onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        Log.d(LOG_TAG, "MainActivity: onCreate() called" )

    }

    override fun onRestart() {

        Log.d(LOG_TAG, "MainActivity: onRestart() called" )

        super .onRestart()

    }

    override fun onStart() {

        Log.d(LOG_TAG, "MainActivity: onStart() called" )

        super .onStart()

    }

    override fun onResume() {

        Log.d(LOG_TAG, "MainActivity: onResume() called" )

        super .onResume()

    }

    override fun onPause() {

        Log.d(LOG_TAG, "MainActivity: onPause() called" )

        super .onPause()

    }

    override fun onStop() {

        Log.d(LOG_TAG, "MainActivity: onStop() called" )

        super .onStop()

    }

    override fun onDestroy() {

        Log.d(LOG_TAG, "MainActivity: onDestroy() called" )

        super .onDestroy()

    }
 }

Android Fragment Lifecycle回调序列

最后,让我们看看运行应用程序时片段中的生命周期回调序列是什么。

动态添加

当我们动态添加片段时,将发生以下回调序列。

您可以在此处看到该活动已创建。 首先调用Activity的onCreate,onStart

然后调用片段的onCreate,onCreateView和onStart。 最后,分别调用Activity和Fragment的onResume。

退出应用程序时:

在这里,活动先被破坏,然后是片段。 因此,活动的onPause,onStop和onDestroy分别在片段之前被首先调用。

静态添加

当我看到这个生命周期回调序列时,我也感到惊讶。 将片段静态添加到活动中后,便会急切创建片段。

退出应用程序时:

与静态加法相同。 活动首先被破坏,然后被破坏。

添加或替换片段

顾名思义,当您添加一个片段时,它会被添加到容器中已有片段的顶部。 但是,如果您调用replace,则容器中的片段将被新片段替换。

这意味着,如果您尝试在活动中按TAG检索片段,则替换片段而不是添加片段就不会找到它。

翻译自: https://www.javacodegeeks.com/2020/09/android-fragment-lifecycle-explained.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值