布局优化

使用viewstub实现延迟加载

viewstub是一个惰性控件,大小为0且不可视,它可以延迟到运行时才填充布局,相比include,他在填充前不消耗资源。其应用场景主要是动态加载某些布局。

include_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">
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text"
        android:drawableBottom="@mipmap/ic_launcher"/>

</LinearLayout>

布局文件

<ViewStub
        android:id="@+id/viewstub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout="@layout/include_layout"/>

java代码

show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mView==null){
                    mView=mViewStub.inflate();
                }
                mTextView= (TextView) mView.findViewById(R.id.text);
                mTextView.setText("hhbjkhk");
                mViewStub.setVisibility(View.VISIBLE);
            }
        });
        display.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mViewStub.setVisibility(View.GONE);
            }
        });
  • viewstub通过layout属性引入布局,但不能导入控件;
  • viewstub通过inflate()或setVisibility()填充布局,inflate()只能调用一次;
  • 要获得子布局中的控件,需要用inflate()返回的View来findviewbyid获得;
  • 子布局跟标签不能用merge

用merge减少布局层次

当一个独立布局文件的根标签是framelayout且没有设置background等属性时,使用merge代替可以减少布局层次,其相当于直接把布局中的子view添加到了父标签中。当include的子布局根标签是relativelayout也可以替换成merge。

详细分析看这篇
Android布局优化之ViewStub、include、merge使用与源码分析

使用compounddrawable

相邻的imageview和textview可以使用compounddrawable合二为一,在textview中使用drawableTop来加载图片:

<TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text"
        android:drawableBottom="@mipmap/ic_launcher"/>

效果:

image

使用layout_weight

使用layout_weight时会使控件被测量两次,当非0dp的linearlayout嵌套时,测量次数会指数增加,所以在使用layout_weight时其layout_width或layout_height要设为0dp

最后,我们可以使用lint来检查布局,具体使用看

Android Studio使用Lint进行代码检查

参考《android高级进阶》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值