- 概述:
- 安卓的逻辑代码是通过xml的id来找对应元素的。安卓的组件化远比前端的组件化复杂,逻辑繁琐。好在安卓的xml可以提供可视化的编程。
- Fragment相对于可以const声明的小组件。前端分为3个部分html,css,js。安卓大概分为两个部分,xml,kt。并且在不同文件内,文件名对应。当然有一个点要思考,组件传值,父子组件通信,也就是Activity 和 Fragement之间的通信。">可以简单的理解为前端组件化, react中的claa组件, 后面还有Fragment相对于可以const声明的小组件。前端分为3个部分html,css,js。安卓大概分为两个部分,xml,kt。并且在不同文件内,文件名对应。当然有一个点要思考,组件传值,父子组件通信,也就是Activity 和 Fragement之间的通信。
- Activity生命周期
- Fragment生命周期
- 向 Activity 添加 Fragement
- 执行Fragement片段事务
- Fragement 与 Activity 通信
- 构建灵活的界面
- 在运行时为 Activity 添加 Fragment
- 替换 Fragment
- 与其他 Fragment 通信
概述:
安卓的逻辑代码是通过xml的id来找对应元素的。安卓的组件化远比前端的组件化复杂,逻辑繁琐。好在安卓的xml可以提供可视化的编程。
可以简单的理解为前端组件化, react中的claa组件, 后面还有Fragment相对于可以const声明的小组件。前端分为3个部分html,css,js。安卓大概分为两个部分,xml,kt。并且在不同文件内,文件名对应。当然有一个点要思考,组件传值,父子组件通信,也就是Activity 和 Fragement之间的通信。
Activity生命周期
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
println("1.系统创建时")
}
override fun onStart() {
super.onStart()
println(" 2.Activity 进入“已开始”状态")
}
override fun onResume() {
super.onResume()
println("3.已恢复状态,应用会一直保存在该状态")
}
override fun onPause() {
super.onPause()
println("4.应用已经暂停,离开应用")
}
override fun onStop() {
super.onStop()
println("5.引用停止,可以用来完成cpu密集的事务")
}
override fun onDestroy() {
super.onDestroy()
println("6. 引用被销毁")
}
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 绝不能直接通信。