Android技术栈(一)从Activity迁移到Fragment,完美收官

Fragment有两种方式生成,一是硬编码到xml文件中,二是在Java代码中new,然后通过FragmentManager#beginTransaction开启FragmentTransaction提交来添加Fragment(下文会介绍).两种方式存在着一定区别.硬编码到xmlFragment无法被FragmentTransition#remove移除,与Activity同生共死,所以你要是这么用了,就不用试了,移除不了的,但是在代码中new出来的是可以被移除的.

硬编码到xml中:

添加Fragment的第二种方式就是使用FragmentManager#beginTransaction(代码如下)动态添加,你需要先new一个Fragment,然后通过下面Fragment#requireFragmentManager获取FragmentManager来使用beginTransaction添加Fragment,注意add方法的第一个参数,你需要给它指定一个id,也就是Fragment容器的id,通常容器是一个没有子ViewFrameLayout,它决定了Fragment要在什么位置显示。

需要注意的是FragmentTransaction并不是立即执行的,而是在当前代码执行完毕后,回到事件循环(也就是你们知道的Looper)时,才会执行,不过他会保证在下一帧渲染之前得到执行(通过Handler#createAsync机制),若要在FragmentTransaction执行时搞事情,你需要使用runOnCommit,下面的代码中我使用了Java8lambda表达式简写了Runnable.

若要使用Fragment回退栈记得addToBackStack,最后别忘了commit,这样才会生效,此时commit函数返回的是BackStackEntryid

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本身

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值