Android学习笔记之探究碎片

(学习参考书:第一行代码第2版)

一、碎片及其使用方式

碎片(fragment)是一种可以嵌入在活动中的UI片段,它能让程序更加合理和充分利用大屏幕的空间。碎片类似于活动,同样能包含布局,有自己的生命周期。

(1)碎片的简单用法

  1. 新建layout布局文件
  2. 新建绑定对应布局文件的类,该类继承Fragment。在该类中重写onCreateView方法。
  3. 在要添加该碎片的活动中添加fragment控件,使用属性
    android:name显式指明要添加的碎片类名,要将包名也加上

(2)动态添加碎片
碎片的真正强大之处在于它可以在程序运行时动态的添加到活动中。步骤如下:

  1. 创建待添加的碎片实例
  2. 获取FragmentManager,在活动中可以直接通过调用getSupportFragmentManager()方法得到。
  3. 开启一个事务,通过调用beginTransaction()方法开启
  4. 向容器中添加或替换碎片,一般使用replace方法实现,需要传入容器的id和待添加的碎片实例
  5. 提交事务。调用commit()方法来完成

(3)在碎片中模拟返回栈
如果在动态添加/更改碎片后想通过Back键返回上一个碎片,即实现类似返回栈的效果。可以这样实现:
FragmentTransaction中提供了一个addToBackStack()方法,它可以用于将一个事务添加到返回栈中。

transaction.addToBackStack(null);

在事务提交前调用该方法,它可以接受一个名字用于描述返回栈的状态,一般传入null即可。

(4)碎片和活动间的通信
虽然碎片都是嵌入在活动中显式,但是碎片和活动都是各自存在于一个独立的类当中的,它们之间没有明显的方式直接进行通信。
为了方便碎片和活动之间进行通信,FragmentManager提供了一个类似于findViewById()的方法,专门用于从布局文件中获取碎片的实例。代码如下:

MyFragment myFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.my_fragment);MyFragment是自定义的碎片类,my_fragment是碎片的布局文件。)

调用FragmentManager的findFragmentById()方法就可以在活动中获得相应实例,然后轻松调用碎片里的方法。
同样的,在每个碎片中通过调用getActivity()方法来得到和当前碎片相关的活动实例。

MainActivity activity = (MainActivity) getActivity();

当碎片需要使用Context对象时,也是使用该方法。
碎片与碎片间通信的方法就是通过中间活动实现。

如果想要通过活动向碎片传递数据,使用Bundle类。

  1. 创建一个Bundle对象,调用putXxx函数
  2. 让已创建的碎片对象调用setArguments()方法传入Bundle对象作为参数
  3. 在碎片的任意方法中声明一个Bundle对象使用getArguments()获取实例
  4. 调用新获取的Bundle对象的getXxx()方法获取数据

二、碎片的生命周期

运行状态:当一个碎片可见并且它所关联的活动处于运行状态,该碎片也处于运行状态。

暂停状态:当一个活动进入暂停状态,与它相关联的可见碎片也会进入到暂停状态

停止状态:当一个活动进入停止状态,与其相关联的碎片会进入到停止状态。或者FragmentTransaction的remove(),replace()方法将碎片从活动中移除,但如果在事务提交之前使用addToBackStack()方法,这时的碎片也会进入停止状态。进入停止状态的碎片对用户完全不可见,有可能被系统回收。

销毁状态:当一个活动进入销毁状态,与其相关联的碎片会进入到销毁状态。或者FragmentTransaction的remove(),replace()方法将碎片从活动中移除,但在事务提交之前并没有使用addToBackStack()方法,这时的碎片也会进入销毁状态。

Fragment类中提供了一系列的回调方法,以覆盖碎片生命周期的每个环节,活动中的回调方法碎片都有除此之外,碎片还有一部分附加的回调方法:

onAttach() 当碎片和活动建立联系时调用
onCreateView() 为碎片加载布局时调用
onActivityCreated() 确保与碎片相关联的活动一定已经创建完毕时调用
onDestoryView() 当与碎片关联的视图被移除的时候调用
onDetach() 当碎片和活动解除关系时调用

三、动态加载布局的技巧

为了满足在不同尺寸和分辨率设备上加载布局的不同,需要使用限定符来决定设备加载的布局文件。Android常见的限定符:
在这里插入图片描述
使用方法:在res目录下新建布局文件夹layout-Qualifier,这里的Qualifier对应上述的限定符,再在该文件夹下创建同名布局文件。

最小宽度限定符:在res目录下新建布局文件夹layout-swXXXdp,当程序运行到屏幕宽度大于XXX的设备时,会默认加载该文件夹下的布局文件。程序运行到屏幕宽度小于XXX的设备时,会默认加载普通的布局文件。

四、Fragment+ViewPager2滑动效果

ViewPager2的使用方式与RecyclerView类似。如果和Fragment结合使用,适配器应该继承于FragmentStateAdapter。具体使用方法如下:

  1. 在布局中添加ViewPager2控件,在活动中获取到实例
  2. 为ViewPager2新建一个适配器继承自FragmentStateAdapter
  3. 在适配器中重写必要的方法,添加碎片列表;并为其构造方法添加一个碎片列表参数
  4. 定义需要的Fragment,合理使用newInstance方法传递参数。
  5. 在onCreateView方法,添加判断,避免重复解析布局;并在该方法中完成布局中控件的设定
  6. 在活动中new一个适配器实例,传入参数getSupportFragmentManager(),getLifecycle(),碎片列表fragments
  7. ViewPager调用setAdapter设置写好的适配器
    常见应用的页面滑动和底部状态栏联动的方法如下:
  8. 新建底部状态栏的xml文件,指定其图片资源为selector类型
  9. 为底部状态栏中的按钮的图片资源指定对应selector
  10. 在活动中获取需要点击的控件和切换状态的图片实例
  11. 调用ViewPager的registerOnPageChangeCallback()方法,参数为一个匿名类,重写其中方法
  12. 在匿名类的onPageSelected()方法中完成相关点选逻辑,一般用switch语句完成
  13. 技巧:声请ImageView的实例时,多申请一个保留当前选择状态的实例;调用ViewPager的setCurrentItem()选择需要切换的碎片
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值