Fragment
有两种方式生成,一是硬编码到xml
文件中,二是在Java
代码中new
,然后通过FragmentManager#beginTransaction
开启FragmentTransaction
提交来添加Fragment
(下文会介绍).两种方式存在着一定区别.硬编码到xml
的Fragment
无法被FragmentTransition#remove
移除,与Activity
同生共死,所以你要是这么用了,就不用试了,移除不了的,但是在代码中new
出来的是可以被移除的.
硬编码到xml
中:
添加Fragment
的第二种方式就是使用FragmentManager#beginTransaction
(代码如下)动态添加,你需要先new
一个Fragment
,然后通过下面Fragment#requireFragmentManager
获取FragmentManager
来使用beginTransaction
添加Fragment
,注意add
方法的第一个参数,你需要给它指定一个id
,也就是Fragment
容器的id
,通常容器是一个没有子View
的FrameLayout
,它决定了Fragment
要在什么位置显示。
需要注意的是FragmentTransaction
并不是立即执行的,而是在当前代码执行完毕后,回到事件循环(也就是你们知道的Looper
)时,才会执行,不过他会保证在下一帧渲染之前得到执行(通过Handler#createAsync
机制),若要在FragmentTransaction
执行时搞事情,你需要使用runOnCommit
,下面的代码中我使用了Java8
的lambda
表达式简写了Runnable
.
若要使用Fragment
回退栈记得addToBackStack
,最后别忘了commit
,这样才会生效,此时commit
函数返回的是BackStackEntry
的id
requireFragmentManager()
.beginTransaction()
.add(id, fragment)
.runOnCommit(()->{/TODO/})
.addToBackStack(null)
.commit();
当然FragmentTransaction
不止可以执行add
操作,同样也可以执行remove
,show
,hide
等操作.
这里插入一个简短的题外话作为上面知识的补充。如何在Android Studio
中启用Java8
?在你模块的build.gradle
中
android{
//省略…
//加上下面的脚本代码,然后sync你的项目
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
onBackPressed
在哪?我知道第一次使用Fragment
的人肯定都超想问这个问题.众所周知Fragment
本身