【安卓】动态加载布局技巧

文章目录

使用限定符

修改FragmentTest项目中的activity_main.xml文件

xml 复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <fragment
        android:id="@+id/leftFrag"
        android:name="com.example.fragmenttest.LeftFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

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

xml 复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment
        android:id="@+id/leftFrag"
        android:name="com.example.fragmenttest.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />
    <fragment
        android:id="@+id/rightFrag"
        android:name="com.example.fragmenttest.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3" />
</LinearLayout>

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

java 复制代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button =(Button) findViewById(R.id.button);
        button.setOnClickListener(this);
//        replaceFragment(new RightFragment());
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.button:
                replaceFragment(new AnotherRightFragment());
                break;
            default:
                break;
        }
    }

    private void replaceFragment(Fragment fragment){
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.rightFrag, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}
常见限定符
屏幕特征 限定符 描述
大小 small 提供给小屏幕设备的资源。
大小 normal 提供给中等屏幕设备的资源。
大小 large 提供给大屏幕设备的资源。
大小 xlarge 提供给超大屏幕设备的资源。
分辨率 ldpi 提供给低分辨率设备的资源(120 dpi以下)。
分辨率 mdpi 提供给中等分辨率设备的资源(120 dpi~160 dpi)。
分辨率 hdpi 提供给高分辨率设备的资源(160 dpi~240 dpi)。
分辨率 xhdpi 提供给超高分辨率设备的资源(240 dpi~320 dpi)。
分辨率 xxhdpi 提供给超超高分辨率设备的资源(320 dpi~480 dpi)。
分辨率 land 提供给横屏设备的资源
分辨率 pord 提供给竖屏设备的资源

使用最小宽度限定符

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

在res目录下新建layout-sw600dp文件夹,这就意味着,当程序运行在屏幕宽度大于等于600 dp的设备上时,会加载对应的布局。

相关推荐
我是咸鱼不闲呀1 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
清水白石0081 小时前
深入解析 LRU 缓存:从 `@lru_cache` 到手动实现的完整指南
java·python·spring·缓存
林开落L1 小时前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制
哎呦 你干嘛~1 小时前
MODBUS协议学习
学习
牛奔1 小时前
Go 是如何做抢占式调度的?
开发语言·后端·golang
小陈phd1 小时前
多模态大模型学习笔记(一)——机器学习入门:监督/无监督学习核心任务全解析
笔记·学习·机器学习
符哥20081 小时前
C++ 进阶知识点整理
java·开发语言·jvm
小猪咪piggy1 小时前
【Python】(4) 列表和元组
开发语言·python
小陈phd2 小时前
多模态大模型学习笔记(二)——机器学习十大经典算法:一张表看懂分类 / 回归 / 聚类 / 降维
学习·算法·机器学习
Sayuanni%32 小时前
初阶_多线程1(线程含义与关键属性)
java