android布局layout的优化及其注意的地方

本文介绍了Android应用中三种常见布局(LinearLayout、RelativeLayout、FrameLayout)的性能对比及优化方法,包括层级压缩、使用merge标签、重复利用布局等策略,并探讨了ViewStub的使用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、android布局LinearLayout、RelateLayout、FrameLayout;三种布局效率从高到底依次为FrameLayout、LinearLayout、RelateLayout。
2、优化布局主要有以下思路:
a、如果同时可以使用FrameLayout、LinearLayout、RelateLayout,则最好使用效率比较高的。但是前提条件就是用三种布局的层次应该是一样,否则使用层次比较少的一种。
b、使用hierarchyviewer对层次分析之后,如果可以压缩层次可以采用merge,例如有两层 FrameLayout,则可以采用merge压缩一层。需要注意的就是merge必须是根节点。
c、尽量使用include,可以让布局重复利用。
d、采用ViewStub,ViewStub是动态加载,初始化的时候尺寸为0,因此可以减少初始化布局文件时间。当需要的时候采用inflate()或者setVisibility(View.VISIBLE)来加载。请参考以下代码:

optimization_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/opt_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="layout优化" />

    <Button
        android:id="@+id/opt_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ViewStub测试" />

    <ViewStub
        android:id="@+id/opt_view_stub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout="@layout/view_stub_layout" />
</LinearLayout>
view_stub_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/view_stub_root"
    android:layout_width="200px"
    android:layout_height="200px">

    <TextView
        android:id="@+id/view_stub_explain"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这个是用来测试ViewStub的,ViewStub当使用的时候再动态加载!"
        android:textAlignment="center" />
</LinearLayout>
public class OptimizationLayout1Activity extends AppCompatActivity {
    private Button mButton = null;
    private ViewStub mViewStub = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.optimization_layout);

        mButton = (Button)findViewById(R.id.opt_button);
        mButton.setOnClickListener((v -> {
//            Debug.waitForDebugger();
            mViewStub = (ViewStub)findViewById(R.id.opt_view_stub);
            mViewStub.inflate();
        }));
    }
}
但是使用ViewStub是有限制的,inflate或者setVisibility只会执行一次,也就是当ViewStub指定的布局文件显示出来之后没有办法再进行控制;如果对于经常显示或者隐藏的控件就无法实现了。
例如单击一次mButton之后再进行单击,此时会抛异常:
 06-27 15:37:58.627 24506-24506/com.example.kingsoft.studyproject E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                   Process: com.example.kingsoft.studyproject, PID: 24506
                                                                                   java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.ViewStub.inflate()' on a null object reference
                                                                                       at com.example.kingsoft.ActivityLibs.OptimizationLayout1Activity.lambda$-com_example_kingsoft_ActivityLibs_OptimizationLayout1Activity_lambda$1(OptimizationLayout1Activity.java:26)
                                                                                       at com.example.kingsoft.ActivityLibs.-$Lambda$0.$m$0(Unknown Source)
                                                                                       at com.example.kingsoft.ActivityLibs.-$Lambda$0.onClick(Unknown Source)
                                                                                       at android.view.View.performClick(View.java:5207)
                                                                                       at android.view.View$PerformClick.run(View.java:21177)
                                                                                       at android.os.Handler.handleCallback(Handler.java:742)

另外,ViewStub所加载的布局控件不能附带高内存对象,例如view_stub_layout.xml增加一个背景图片:

view_stub_layout.xml  中增加一个背景 android:background="@drawable/image1"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/view_stub_root"
    android:layout_width="200px"
    android:layout_height="200px">

    <TextView
        android:id="@+id/view_stub_explain"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这个是用来测试ViewStub的,ViewStub当使用的时候再动态加载!"
        android:textAlignment="center" />
</LinearLayout>
抛出的异常如下:
 Process: com.example.kingsoft.studyproject, PID: 3953
                                                                                 android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class <unknown>
                                                                                     at android.view.LayoutInflater.inflate(LayoutInflater.java:543)
                                                                                     at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
                                                                                     at android.view.ViewStub.inflate(ViewStub.java:259)
                                                                                     at com.example.kingsoft.ActivityLibs.OptimizationLayout1Activity.lambda$-com_example_kingsoft_ActivityLibs_OptimizationLayout1Activity_lambda$1(OptimizationLayout1Activity.java:26)
                                                                                     at com.example.kingsoft.ActivityLibs.-$Lambda$0.$m$0(Unknown Source)
                                                                                     at com.example.kingsoft.ActivityLibs.-$Lambda$0.onClick(Unknown Source)
                                                                                     at android.view.View.performClick(View.java:5207)

因此,综上所述,如何对布局进行优化,需要根据业务情况来使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值