第一行代码Android个人笔记(三)——探究Fragment

tech2025-01-08  10

文章目录

一、动态添加Fragment二、Fragment和Activity间的通信1、Activity中获取Fragment2、Fragment中获取Activity3、Fragment中获取Fragment 三、Fragment生命周期四、实现根据屏幕大小动态加载布局- 附:Android中常见的限定符

一、动态添加Fragment

很简单,直接上代码

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener { replaceFragment(AnotherRightFragment()) } replaceFragment(RightFragment()) } //替换Fragment的函数 fun replaceFragment(fragment: Fragment){ //先获取fragmentManager,在Activity中使用supportFragmentManager val fragmentManager = supportFragmentManager //开启一个事务 val transaction = fragmentManager.beginTransaction() //使用replace()替换Fragment;参数一:Fragment父节点,参数二:要替换为的Fragment transaction.replace(R.id.rightLayout,fragment) //提交事务 transaction.commit() } }

此时,按下返回键会直接退出应用程序,那么如何将fragment添加入返回栈呢? 只需要一行代码

//添加至返回栈 transaction.addToBackStack(null)

二、Fragment和Activity间的通信

1、Activity中获取Fragment

val fragment = supportFragmentManager.findFragmentById(R.id.leftFrag) as LeftFragment

由于findFragmentById()方法返回的是Fragment实例,所以这里如果我们想使用LeftFragment里的方法,就必须使用 as LeftFragment 进行类型转换

由于fragment同样支持plugin: 'kotlin-android-extensions'所以我们也可以在kotlin的代码中直接获取:

val fragment2:LeftFragment = leftFrag as LeftFragment

2、Fragment中获取Activity

可以在fragment里使用getActivity()方法获取 它所在的 activity 如果该fragment没有被放进activity中,则使用getActivity()会返回null,所以要进行判空处理

if (activity != null){ val mainActivity = activity as MainActivity }

3、Fragment中获取Fragment

先获取Activity,再使用Activity获取Fragment

三、Fragment生命周期

偷个懒,参见:Fragment生命周期

四、实现根据屏幕大小动态加载布局

先在res目录下创建layout-large文件夹,再在文件夹下创建与要适配的activity界面同名称的文件,如这里是:activity_main.xml

注意:若layout-large文件夹上右键-NEW-XML-Layout XML File提示无法创建重复的布局文件

方法:在该文件夹上右键默认还是在layout文件夹内创建布局文件,与原来的activity_main冲突。 应该在该文件夹右键-NEW-Layout Resource File创建新的xml。

则在大屏幕设备上会自动加载layout-large文件夹中的activity_main。

- 附:Android中常见的限定符

屏幕大小的限定符 small 提供给小屏幕设备的资源normal 提供给中等屏幕设备的资源large 提供给大屏幕设备xlarge 提供给超大屏幕设备的资源 屏幕分辨率的限定符 ldpi 提供给低分辨率设备的资源(120dpi以下)mdpi 提供给中等分辨率设备的资源(120dpi-160dpi)hdpi 提供给高分辨率设备的资源(160dpi-240dpi)xhdpi 提供给超高分辨率设备的资源(240dpi-320dpi)xxhdpi 提供给更高分辨率设备的资源(320dpi-480dpi) 屏幕方向的限定符 land 提供给横屏设备的资源port 提供给竖屏设备的资源 屏幕宽度限定符 layout-sw600dp
最新回复(0)