一到四节演示一个简单例子,在Activity中添加两个Fragment来平分Activity左右空间。
一、新建左Fragment(left_fragment.xml)
<LinearLayout...>
<Button.../>
</LinearLayout>
二、新建右Fragment(right_fragment.xm)
<LinearLayout...>
<TextView.../>
</LinearLayout>
三、新建LeftFragment类,继承自Fragment(AndroidX),右Fragment同样
class LeftFragment: Fragment() {
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?) : View? {
return inflater.inflate(R.layout.left_fragment,container,false)
}
}
四、在activity_main.xml中添加左右Fragment
<LinearLayout android:orientation = "horizontal" ...>
<fragment
android:name = "com.example.fragmenttest.LeftFragment"
android:layout_width = "0dp"
android:layout_height ="match_parent"
android:layout_weight = "1"
/>
<fragment
android:name = "com.example.fragmenttest.RightFragment"
android:layout_width = "0dp"
android:layout_height ="match_parent"
android:layout_weight = "1"
/>
</LinearLayout>
运行软件后可以看到两个Fragment平分左右页面
五、动态添加Fragment
<!-- 将上节中右Fragment代码修改为如下所示 -->
<FragmentLayout
android:id = "@+id/rightLayout"
android:layout_width = "0dp"
android:layout_height ="match_parent"
android:layout_weight = "1"
/>
// 这里将动态修改Fragment的代码封装成一个方法
// 形参fragment就是要动态切换的Fragment布局对象
private fun replaceFragment(fragment: Fragment){
val fragmentManager = supportFragmentManager
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.rightLayout,fragment)
// 将fragment添加到返回栈,这样用户返回不会直接退出软件(非必须)
transaction.addToBackStack(null)
transaction.commit()
}
六、在Fragment与Activity中互相获取对方实例
// 在Activity中获取fragment实例
val fragment = supportFragmentManager.findFragmentById(R.id.leftFragment) as LeftFragment
// 在Fragment中获取Activity实例
if(activity != null) {
val mainActivity = activity as MainActivity
}
七、Fragment生命周期
- 运行状态:
关联的Activity运行时,该Fragment也处于运行状态。 - 暂停状态:
Activity暂停/未占满屏幕/Activity到栈顶,Fragment也会处于暂停状态。 - 停止状态:
Activity停止/在调用remove()、replace()前已经入栈,Fragment进入停止状态。 - 销毁状态:
Activity销毁/在调用remove()、replace()前未入栈,Fragment销毁。
- onAttach():当Fragment与Activity建立关联时。
- onCreateView():Fragment创建视图/加载布局时调用。
- onActivityCreated():Fragment关联的Activity创建完毕时调用。
- onDestroyView():与Fragment关联视图被移除时调用。
- onDeath():Fragment与Activity解除关联时调用。