一、动态添加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