开始开发 CriminalIntent 应用啦!
理论上该应用会由两个页面组成,一个负责管理记录列表界面,另一个负责管理记录明细界面。
然后呢,由于有平板的存在,对于平板的屏幕尺寸来说,为了适配它,这两个页面可以显示在一屏中。
UI
为了适配手机和平板设备的两种不同的 UI 结构,接下来就要学习新的知识点啦!🆙
fragment 是一种控制器对象,activity 可委派它执行任务,它可以让应用更具有灵活性。
它有自己的视图(由布局文件实例化而来),视图包含了用户可以交互的可视化UI元素。
activity视图可以提供多个位置给fragment,也就是一个activity里面可以含有多个fragment。
一些新的Android Jetpack API,比如导航控制器(navigation controller),就能完美地支持fragment。(真是学无止境呢~)
官方有关 Fragment 的介绍参考:
https://developer.android.com/jetpack/androidx/releases/fragment
当然就是创建新项目,创建需要的各种类。书中的图参考理解一下该项目的层级结构,然后就是自行实践敲代码。
MainActivity托管着CrimeFragment
CriminalIntent应用的对象图解
/**
* Crime 陋习实体类
*
* @property id
* @property title
* @property date
* @property isSolved
* @constructor Create empty Crime
*/
data class Crime(
val id: UUID = UUID.randomUUID(),
var title: String = "",
var date: Date = Date(),
var isSolved: Boolean = false
)
UUID是Android框架里的工具类,用来生成唯一ID。date 默认当前日期。
预览
意思就是 activity 在其布局中为 fragment 的视图安排位置,并管理 fragment 实例的生命周期。
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/flayout_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
FragmentManager 类负责 fragment 视图添加到 activity 中,具体会管理 fragment 队列和 fragment 事务回退栈。
FragmentManager图解
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val currentFragment = supportFragmentManager.findFragmentById(R.id.flayout_fragment_container)
if(currentFragment == null){
val crimeFragment = CrimeFragment.newInstance()
// add 的参数是容器视图资源ID和新创建的CrimeFragment。
supportFragmentManager.beginTransaction()
.add(R.id.flayout_fragment_container, crimeFragment)
.commit()
}
}
}
fragment 事务被用来添加、移除、附加、分离或替换 fragment 队列中的fragment。
val currentFragment = supportFragmentManager.findFragmentById(R.id.flayout_fragment_container) 这行代码的缘由:
设备旋转或回收内存时,Android系统会销毁MainActivity,而后重建时,会调用MainActivity.onCreate(Bundle?)函数。activity被销毁时,它的FragmentManager会将fragment队列保存下来。这样,activity重建时,新的FragmentManager会首先获取保存的队列,然后重建fragment队列,从而恢复到原来的状态。
如图所示:
fragment生命周期
activity的生命周期函数由操作系统负责调用,而fragment的生命周期函数由托管activity的FragmentManager负责调用。
添加 fragment 供 FragmentManager 管理时,onAttach(Context?)、onCreate(Bundle?)和onCreateView(...)函数会被调用。
向处于运行状态的 activity 中添加 fragment 时,以下 fragment 生命周期函数会被依次调用:onAttach(Context?)、onCreate(Bundle?)、onCreateView(...)、onViewCreated(...)、onActivityCreated(Bundle?)、onStart()以及onResume(),当 fragment 的快速同步上 activity 最新的生命周期状态的后,托管activity的FragmentManager就会边接收操作系统的调用指令,边调用其他生命周期函数,让 fragment与activity保持步调一致。
fragment 的本意是封装关键部件以方便复用,实践证明,应用单屏最多使用2~3个 fragment。
当然,简单的应用,就可以不必使用它啦,对于复杂的应用,那还是有必要使用的,记住合理使用就OK啦!
具体代码 Demo 地址:https://github.com/visiongem/AndroidGuideApp/tree/master/CriminalIntent
🌈关注我吖~❤️