虽然动态添加碎片的功能很强大,但在很多实际开发过程中,它只是在一个布局文件中进行一些添加和替换的操作。若我们的程序能够根据设备的分辨率或屏幕的大小在运行时来决定加载哪个布局,那我们可以发挥的空间就很多了,下面我们一起来简单看一下动态加载布局的技巧。
1.使用限定符
我们如果经常使用平板我们会发现在平板的屏幕上我们很多的使用的是双页模式,但是在手机一次只能显示一页,我们在运行程序是添加Qualifiers限定符帮助我们解决这个问题
我们将activity_main中的代码修改如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.pc123.left_fragement.MainActivity">
<fragment
android:id="@+id/left_frament"
android:name="com.example.pc123.left_fragement.leftFragement"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
只留下一个左侧的布局。
在res下新建一个activity_large文件,在其中新建一个名字也是activity_main的布局文件,其中代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/left_fragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
tools:ignore="Suspicious0dp" />
<fragment
android:id="@+id/right_fragmennt"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
tools:ignore="Suspicious0dp" />
</LinearLayout>
可见layout/layout_main中包含了一个碎片,而layout_large/layout_main中包含了两个碎片,其中large就是一个限定符,那些屏幕被认为是large的就会自动加载layout_large文件,然后将mainactivity中的replaceFragment()中的代码注释掉。
还有几种限定符介绍如下:
大小:
1. small:提供给小屏幕设备的资源
2. normal:提供给中等屏幕的资源
3. large:提供给大屏幕设备的资源
4. xlarge:超大屏幕
分辨率:
5. ldpi:提供给低分辨率(120dpi以下)
6. mdpi:中等分辨率(120-160)
7. hdpi:高分辨率(160-240)
8. xhdpi:超高(240-320)
9. xxhdpi(320-480)
方向:
10. land:横屏设备
11. port:竖屏设备
2.使用最小宽度限定符
我们在上面解决了单双页的问题,但是我们对large到底是多大还不能判断,所以我们需要引入新的限定符,来实现这些,为此我们引入了Smallest-widthQualifier。
同样的方法我们在res下新建layout-sw600dp文件,在这个文件夹下新建activity_main布局,在其中添加我们想用的布局元素,当我们运行在屏幕宽度大于600dp的设备上时就会调用这个文件,反之还是会调用默认的文件。