一、在碎片中模拟返回栈
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
提交事务之前调用FragmentTransaction的addToBackStack(),它可以接受一个名字用于描述返回栈的状态,一般传入null即可。这样,当你按下Back键,会把替换之前的Fragment显示出来。
二、碎片和活动通信
1、活动中调用碎片:getFragmentManager()的findFragmentById()可从布局文件中获取碎片的实例。
2、碎片中调用活动:在碎片中调用getActivity()可得到和当前碎片相关联的activity实例。当碎片中需用Context对象时,也用getActivity(),因为activity本身就是一个Context对象。
3、碎片和碎片怎么通信呢:在碎片获取活动,通过这个活动再去获取另一个碎片。
三、碎片生命周期
1、在碎片中也可通过onSaveInstanceState()来保存数据,因为进入停止状态的碎片有可能被系统回收。保存下来的数据在onCreate()、onCreateView()、onActivityCreated()三个方法中都能重新获得。
2、通过调用FragmentTransaction的remove()、replace()将碎片从活动中移除,碎片会进入停滞状态。但有在事务提交之前调用addToBackStack(),这时的碎片也会进入停止状态。
四、动态加载布局的技巧
动态添加碎片当然可以解决这个问题。程序也可根据设备的分辨率或屏幕大小在运行时决定加载哪个布局。
1、使用限定符
在layout/acitivty_main中只包含一个碎片,即单页模式;而在layout-large/activity_main布局中包含两个碎片,即双页模式。large就是一个限定符,那些屏幕被认为是large的设备会自动加载layout-large文件夹下的布局,而小屏幕的设备则还是会加载layout文件夹下的布局。常见限定符:
2、用最小限定符
上面用到了large,但是large到底多大呢?这时可以使用最小限定符:允许我们对屏幕宽度指定一个最小值,然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,小于这个宽度的设备就加载另一个布局。示例:在res下新建layout-sw600dp文件夹。当屏幕宽度大于600dp时,会加载此文件夹下的布局。