一、静态Fragment
1、新建一个项目后,在layout里面新建一个左侧碎片布局left_fragment和一个右侧碎片布局right_fragment.xml
二、接着新建一个LeftFragment.class,让它继承Fragment
同样的方法在新建一个RightFragment.class
三、接下来直接修改activity_main.xml的代码
使用了标签在布局中添加碎片,需要通过android:name属性来显示指明要添加的碎片类名。注意要将类的包名加上
四、动态添加碎片
1、在上面的代码继续完善,新建另一个碎片anothor_right_fragment.xml
2、新建一个AnothorRightFragment.class
3、在activity_main.xml将上面的右侧碎片替换成FramLayout
4、修改MainActivity代码,构建replaceFragment()方法
五、在碎片中模拟返回栈
在上面我们已经成功的动态添加碎片,按选Back键发现会直接退出程序,那么我们样回到上一个碎片呢?
很简单,FragmentTrasaction中提供了一个addToBackStack()方法,可以用于将一个事务添加到返回栈中,修改MainActivity代码,就在replaceFragment()方法里添加一句代码,已标注红色
六、碎片和活动之间的通信
碎片和活动都是存在一个单独的类当中,如果想在活动中调用碎片里的方法,或者在碎片中调用活动里的方法,应该如何实现?
为了方便碎片和活动之间的通信,FragmentManager提供了一个类似于findViewById()的方法,专门用于从布局文件中获取碎片的实例,代码如下
RightFragment rightment = (RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment);
调用FragmentManager的findFragmentById()方法,可以在活动中得到相应碎片的实例,就能够轻松的调用碎片里的方法。
那碎片中又该怎样调用活动里的方法呢?
其实更简单了,在每个碎片中都可以通过调用getActivity()方法得到和当前碎片相关的活动实例,代码如下所示:
MainActivity activity = (MainActivity) getActivity();
七、动态加载布局的技巧:使用限定符
使用平板可以双页查看,左边子项,右边是相对应内容,但是手机是单页模式,子项和内容需要分开显示;那么怎样才能在运行时判断程序应该是使用双页模式还是单页模式?这就是需要借助限定符(Qualifiers)来实现了,修改上面的activity_main.xml文件
接着在res目录下新建layout-large文件夹,在这个文件夹新建一个布局,也叫作activity_main.xml
layout/activity_main布局只包含了一个碎片,即单页模式,而layou-large/activity布局包含了两个碎片,即双页模式,其中large就是一个限定符,那么屏幕被认为是larger的设备就会自动加载layout-large文件夹下的布局,而小的屏幕设备则还是会加载layou文件夹下的布局
然后将MainActivity中replaceFragment()方法里的代码注释掉,并在平板模拟器上重新运行程序。
Android常用的限定符,这里借用博主小七的笔记文章
八、使用最小宽度限定符
问题:large到底是指多大,有的时候我们希望可以更灵活地为不同设备加载布局,不管它们是不是被系统认定为large,这时就可以使用最小宽度限定符(Smallest-width Qualifier)了
最小宽度限定符允许我们对屏幕的宽度指定一个最小值(以dp为单位),然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,屏幕宽度小于这个值的设备就加载另一个布局。
在res目录下新建layout-sw600dp文件夹,然后在这个文件夹新建activity_main.xml布局,代码如下所示:
这就意味着,当程序运行在屏幕大于等于600dp的设备上时,会加载layout-sw600dp/activity_main布局,当程序运行在屏幕宽度小于600dp的设备上时,则仍然加载默认的layout/activity_main布局
根据郭霖大神《第一行代码》学习,敬礼!