Fragment 用于兼顾手机平板
5.1 Fragment是什么
Fragment是一种可以嵌入在Activity当中的UI片段
作用:让程序更加合理和充分地利用大屏幕的空间。
5.2Fragment的使用方式
- 先书写fragment的布局文件
- 建立对应的类,并让他继承自Fragment(注意:此处需要选择AndroidX库中的Fragment)
- 需要重写Fragment中的onCreateView()方法
- 在需要Fragment的页面布局中引入,(注意:需要设置name属性,要加上包名)
<fragment
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/leftLrag"
android:name="com.swpu.ylq.fragmenttest.LeftFragment"/>
5.2.2动态添加Fragment
前面几个步骤同上:但是在引入时存在区别,这里使用了帧布局(FrameLayout),用于实现动态添加Fragment
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/rightLayout"
android:layout_weight="1">
</FrameLayout>
书上的总结:
- 创建待添加Fragment的实例
- 获取FragmentManager,在Activity中可以直接调用getSupportFragmentManager()方法获取
- 开启一个事务,通过调用beginTransaction()方法开启。
- 向容器内添加或替换Fragment,一般使用replace()方法来实现,需要传入容器的id和待添加的Fragm实例
- 提交事务,调用commit()方法完成。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener{
replaceFragment(AnotherRightFragment())
}
replaceFragment(RightFragment())
}
private fun replaceFragment(fragment: Fragment){
//1.获取FragmentManager
val fragmentManager = supportFragmentManager
//2.开启事务,beginTransaction()
val transaction = fragmentManager.beginTransaction()
//3.添加或者替换Fragment,replace()
transaction.replace(R.id.rightLayout,fragment)
//4.提交事务,commit()
transaction.commit()
}
5.2.3在Fragment中实现返回栈
实现:使用FragmentTransaction中提供的**addToBackStack()**方法
private fun replaceFragment(fragment: Fragment){
//1.获取FragmentManager
val fragmentManager = supportFragmentManager
//2.开启事务,beginTransaction()
val transaction = fragmentManager.beginTransaction()
//3.添加或者替换Fragment,replace()
transaction.replace(R.id.rightLayout,fragment)
//实现返回栈
transaction.addToBackStack(null)
//4.提交事务,commit()
transaction.commit()
}
5.2.4 Fragment和Activity之间的交互
存在问题:Fragment和Activity是各自存在于一个独立的类中,它们之间并没有明显的方式来直接进行交互
解决问题:FragmentManager 提供了类似于findViewById()的方法,专门用于从布局文件中获取Fragment的实例。
val fragment=supportFragmentManager.findFragmentById(R.id.leftFrag) as LeftFragment
问题二:如何在Fragment中调用Activity中的方法?
解决问题二:在每个Fragment中可以通过调用getActivity()方法来的得到和当前Fragment相关联的Activity实例(注意:由于getActivity()方法有可能返回null,需要进行判空处理)
2020/4/16 详细内容可以阅读第一行代码,Android第三版