概述:

安卓的逻辑代码是通过xml的id来找对应元素的。安卓的组件化远比前端的组件化复杂,逻辑繁琐。好在安卓的xml可以提供可视化的编程。

可以简单的理解为前端组件化, react中的claa组件, 后面还有Fragment相对于可以const声明的小组件。前端分为3个部分html,css,js。安卓大概分为两个部分,xml,kt。并且在不同文件内,文件名对应。当然有一个点要思考,组件传值,父子组件通信,也就是Activity 和 Fragement之间的通信。

Activity生命周期

  1. override fun onCreate(savedInstanceState: Bundle?) {
  2. super.onCreate(savedInstanceState)
  3. println("1.系统创建时")
  4. }
  5. override fun onStart() {
  6. super.onStart()
  7. println(" 2.Activity 进入“已开始”状态")
  8. }
  9. override fun onResume() {
  10. super.onResume()
  11. println("3.已恢复状态,应用会一直保存在该状态")
  12. }
  13. override fun onPause() {
  14. super.onPause()
  15. println("4.应用已经暂停,离开应用")
  16. }
  17. override fun onStop() {
  18. super.onStop()
  19. println("5.引用停止,可以用来完成cpu密集的事务")
  20. }
  21. override fun onDestroy() {
  22. super.onDestroy()
  23. println("6. 引用被销毁")
  24. }

Fragment生命周期

官方建议至少包含以下3个生命周期的方法。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    //系统会在创建片段时调用此方法。
    //当片段经历暂停或停止状态继而恢复后,如果您希望保留此片段的基本组件,
    //则应在您的实现中将其初始化。
}

 override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_homek, container, false)
}

override fun onPause() {
    super.onPause()
//        系统会将此方法作为用户离开片段的第一个信号(但并不总是意味着此片段会被销毁)进行调用。
//        通常,您应在此方法内确认在当前用户会话结束后仍然有效的任何更改(因为用户可能不会返回)。
}

批注:fragment通常用作 Activity 界面的一部分,并且会将其自己的布局融入 Activity。
如要为片段提供布局,您必须实现 [onCreateView()](https://developer.android.google.cn/reference/androidx/fragment/app/Fragment#onCreateView(android.view.LayoutInflater,%20android.view.ViewGroup,%20android.os.Bundle)) 回调方法,Android 系统会在片段需要绘制其布局时调用该方法。此方法的实现所返回的 [View](https://developer.android.google.cn/reference/android/view/View) 必须是片段布局的根视图。

向 Activity 添加 Fragement

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

官方给出的答案在xmk添加Fragment,从前端编程组件来理解,就是组件嵌套,

执行Fragement片段事务

彻底理解后再写

Fragement 与 Activity 通信

代码验证后再编写

构建灵活的界面

利用 [FragmentManager](https://developer.android.google.cn/reference/androidx/fragment/app/FragmentManager) 类提供的方法,您可以在运行时为 Activity 添加、移除和替换 Fragment,从而营造出动态的用户体验。

在运行时为 Activity 添加 Fragment

  <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 import android.os.Bundle
    import android.support.v4.app.FragmentActivity

    class MainActivity : FragmentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.news_articles)

            // Check that the activity is using the layout version with
            // the fragment_container FrameLayout
            if (findViewById(R.id.fragment_container) != null) {

                // However, if we're being restored from a previous state,
                // then we don't need to do anything and should return or else
                // we could end up with overlapping fragments.
                if (savedInstanceState != null) {
                    return;
                }

                // Create a new Fragment to be placed in the activity layout
                val firstFragment = HeadlinesFragment()

                // In case this activity was started with special instructions from an
                // Intent, pass the Intent's extras to the fragment as arguments
                firstFragment.arguments = intent.extras

                // Add the fragment to the 'fragment_container' FrameLayout
                supportFragmentManager.beginTransaction()
                        .add(R.id.fragment_container, firstFragment).commit()
            }
        }
    }

替换 Fragment

替换 Fragment 的过程与添加 Fragment 类似,但需要调用 [replace()](https://developer.android.google.cn/reference/androidx/fragment/app/FragmentTransaction#replace(int,%20android.support.v4.app.Fragment)) 方法,而非 [add()](https://developer.android.google.cn/reference/androidx/fragment/app/FragmentTransaction#add(android.support.v4.app.Fragment,%20java.lang.String))

与其他 Fragment 通信

为了重复使用 Fragment 界面组件,您应将每个组件构建为一个完全独立的模块化组件,并且定义自己的布局和行为。定义这些可重用的 Fragment 后,您可以将它们与 Activity 相关联,并将其与应用逻辑相关联以实现整个复合界面。
您经常需要一个 Fragment 与另一个 Fragment 通信,比如为了根据用户事件更改内容。所有 Fragment 到 Fragment 的通信都是通过共享的 ViewModel 或关联的 Activity 来完成的。两个 Fragment 绝不能直接通信。