您的位置:首页 > 移动开发 > Android开发

Android布局优化----ViewSub的使用

2016-12-07 16:25 253 查看
最近在做app优化方面的东西,布局优化时用到了ViewSub,一个使用简单但也很强大的控件,在此做个小结。

  首先说一说ViewSub是什么:
ViewSub继承了View,它非常轻量级且宽高都是0,因此它本身不参与任何的布局和绘制过程。ViewSub的意义在于按需加载所需的布局文件,在实际开发中,很多布局文件在正常情况下不会显示。比如网络异常时的界面,这个时候就没有必要在整个界面初始化的时候加载进来,通过ViewSub就可以做到在使用的时候再加载,提高利了程序初始化时的性能。
代码:
<ViewStub
android:id="@+id/viewstub_loading"
android:inflatedId="@+id/inflated"
android:layout_centerInParent="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:layout_marginTop="10dip"
android:layout="@layout/loadingview"/>

layou指定的布局文件就是ViewSub要加载的布局页面,这是一个xml文件。
那么如何实按需加载:
代码:
ViewStub  viewstub_loading=(ViewStub) findViewById(R.id.viewstub_loading);
viewstub_loading.inflate();或者:viewstub_loading.setVisibility(View.INVISIBLE);

使用上面的代码就可以把需要加载的页面显示出来。
但是请注意,这样的加载只能实现调用一次。尤其是 viewstub_loading.inflate();只能调用一次
再次调用就会报错。原因是:
因为inflate的时候是将其指向的布局文件解析inflate并替换掉当前ViewStub本身(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的布局文件中就没有ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息:ViewStub
must have a non-null ViewGroup viewParent。

这也就是ViewSub使用时的局限性。按需加载的布局只能加载一次。如果再想显示只能是销毁当前页面再次进入时才能再次使用。
除了这一点还有一个注意事项:(android:id和 android:inflatedId)
在xml文件中ViewSub有两个id   android:id="@+id/viewstub_loading"  
                                                  android:inflatedId="@+id/inflated"
其中viewstub_loading 是ViewSub的id 而inflated 是layout="@layout/loadingview“ 的根布局id
具体看一段代码:
loadingview.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/loading"
android:scaleType="fitXY" />
</RelativeLayout>
Activity中的使用:
ViewStub viewstub_loading=(ViewStub) findViewById(R.id.viewstub_loading);
viewstub_loading.inflate();
View view = findViewById(R.id.inflated);
ImageView imageview=(ImageView) view.findViewById(R.id.imageview);

通过 id :viewstub_loading 可以引用ViewSub
通过 id:inflated   可以找到被ViewSub引用的布局文件以及对应的控件
这样可以避免引用控件时候的空指针情况的发生。

ViewSub使用并不复杂,而且其优点显而易见,不过使用时还是要考虑其局限性。
如果程序运行期间要一直控制其显示或者隐藏,那就不适合使用。
如果程序运行期间 ,某个布局在Inflate 后就不会变化,那就可以考虑使用
另外需要注意的是,ViewSub控制的是一个布局文件的显示或者隐藏而并非某个控件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: