Fragment的限定符

来源:互联网 发布:济宁新闻网网络问政 编辑:程序博客网 时间:2024/05/01 17:02

如果你经常使用平板电脑,应该会发现很多的平板应用现在都采用的是双页模式(程序会在左侧的面板上显示一个包含子项的列表,在右侧的面板上显示内容),因为平板电脑的屏幕足够大,完全可以同时显示下两页的内容,但手机的屏幕一次就只能显示一页的内容,因此两个页面需要分开显示。

那么怎样才能在运行时判断程序应该是使用双页模式还是单页模式呢?这就需要借助限定符(Qualifiers)来实现了。我们通过一个例子来学习一下它的用法,修改FragmentTest项目中的activity_main.xml文件,代码如下所示:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

   android:layout_height="match_parent" >

 

    <fragment

       android:id="@+id/left_fragment"

       android:name="com.example.fragmenttest.LeftFragment"

        android:layout_width="match_parent"

        android:layout_height="match_parent"/>

 

</LinearLayout>

这里将多余的代码都删掉,只留下一个左侧碎片,并让它充满整个父布局。接着在res目录下新建layout-large文件夹,在这个文件夹下新建一个布局,也叫做activity_main.xml,代码如下所示:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="match_parent"

   android:layout_height="match_parent" >

 

    <fragment

       android:id="@+id/left_fragment"

       android:name="com.example.fragmenttest.LeftFragment"

        android:layout_width="0dp"

       android:layout_height="match_parent"

        android:layout_weight="1"/>

 

    <fragment

        android:id="@+id/right_fragment"

       android:name="com.example.fragmenttest.RightFragment"

        android:layout_width="0dp"

       android:layout_height="match_parent"

        android:layout_weight="3"/>

 

</LinearLayout>

可以看到,layout/activity_main布局只包含了一个碎片,即单页模式,而layout-large/ activity_main布局包含了两个碎片,即双页模式。其中large就是一个限定符,那些屏幕被认为是large的设备就会自动加载layout-large文件夹下的布局,而小屏幕的设备则还是会加载layout文件夹下的布局。

然后将MainActivity中按钮点击事件的代码屏蔽掉,并在平板模拟器上重新运行程序,效果如图4.13所示。

图 4.13

再启动一个手机模拟器,并在这个模拟器上重新运行程序,效果如图4.14所示。

图 4.14

这样我们就实现了在程序运行时动态加载布局的功能。

Android中一些常见的限定符可以参考下表。

屏幕特征

限定符

描述

大小

small

提供给小屏幕设备的资源

normal

提供给中等屏幕设备的资源

large

提供给大屏幕设备的资源

xlarge

提供给超大屏幕设备的资源

分辨率

ldpi

提供给低分辨率设备的资源(120dpi以下)

mdpi

提供给中等分辨率设备的资源(120dpi到160dpi)

hdpi

提供给高分辨率设备的资源(160dpi到240dpi)

xhdpi

提供给超高分辨率设备的资源(240dpi到320dpi)

方向

land

提供给横屏设备的资源

port

提供给竖屏设备的资源

 

4.4.2 使用最小宽度限定符

在上一小节中我们使用large限定符成功解决了单页双页的判断问题,不过很快又有一个新的问题出现了,large到底是指多大呢?有的时候我们希望可以更加灵活地为不同设备加载布局,不管它们是不是被系统认定为“large”,这时就可以使用最小宽度限定符(Smallest-width Qualifier)了。

最小宽度限定符允许我们对屏幕的宽度指定一个最小指(以dp为单位),然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,屏幕宽度小于这个值的设备就加载另一个布局。

在res目录下新建layout-sw600dp文件夹,然后在这个文件夹下新建activity_main.xml布局,代码如下所示:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

   android:layout_height="match_parent" >

 

    <fragment

       android:id="@+id/left_fragment"

       android:name="com.example.fragmenttest.LeftFragment"

        android:layout_width="0dp"

        android:layout_height="match_parent"

        android:layout_weight="1"/>

 

    <fragment

       android:id="@+id/right_fragment"

       android:name="com.example.fragmenttest.RightFragment"

        android:layout_width="0dp"

       android:layout_height="match_parent"

        android:layout_weight="3"/>

 

</LinearLayout>

这就意味着,当程序运行在屏幕宽度大于600dp的设备上时,会加载layout-sw600dp/activity_main布局,当程序运行在屏幕宽度小于600dp的设备上时,则仍然加载默认的layout/activity_main布局。

需要注意一点,最小宽度限定符是在Android 3.2版本引入的,由于这里我们最低兼容的系统版本是4.0,所以可以放心地使用它。

0 0
原创粉丝点击