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


最近在做app优化方面的东西,布局优化时用到了ViewSub,一个使用简单但也很强大的控件,在此做个小结。


  首先说一说ViewSub是什么:
ViewSub继承了View,它非常轻量级且宽高都是0,因此它本身不参与任何的布局和绘制过程。ViewSub的意义在于按需加载所需的布局文件,在实际开发中,很多布局文件在正常情况下不会显示。比如网络异常时的界面,这个时候就没有必要在整个界面初始化的时候加载进来,通过ViewSub就可以做到在使用的时候再加载,提高利了程序初始化时的性能。
代码:
   
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



 
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控制的是一个布局文件的显示或者隐藏而并非某个控件。






你可能感兴趣的:(android)