Android布局优化之ViewStub控件

 更新时间:2016年05月31日 17:20:37   作者:Windstep  
ViewStub是一个非常轻量级的View,这篇文章主要为大家详细介绍了Android布局优化之ViewStub控件的使用方法以及注意事项,感兴趣的小伙伴们可以参考一下

ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View。虽然Android开发人员基本上都听说过,但是真正用的可能不多。

ViewStub可以理解成一个非常轻量级的View,与其他的控件一样,有着自己的属性及特定的方法。当ViewStub使用在布局文件中时,当程序inflate布局文件时,ViewStub本身也会被解析,且占据内存控件,但是与其他控件相比,主要区别体现在以下几点:

1.当布局文件inflate时,ViewStub控件虽然也占据内存,但是相相比于其他控件,ViewStub所占内存很小;

2.布局文件inflate时,ViewStub主要是作为一个“占位符”的性质,放置于view tree中,且ViewStub本身是不可见的。ViewStub中有一个layout属性,指向ViewStub本身可能被替换掉的布局文件,在一定时机时,通过viewStub.inflate()完成此过程;

3.ViewStub本身是不可见的,对ViewStub setVisibility(..)与其他控件不一样,ViewStub的setVisibility 成View.VISIBLE或INVISIBLE如果是首次使用,都会自动inflate其指向的布局文件,并替换ViewStub本身,再次使用则是相当于对其指向的布局文件设置可见性。

这里需要注意的是:

1.ViewStub之所以常称之为“延迟化加载”,是因为在教多数情况下,程序无需显示ViewStub所指向的布局文件,只有在特定的某些较少条件下,此时ViewStub所指向的布局文件才需要被inflate,且此布局文件直接将当前ViewStub替换掉,具体是通过viewStub.infalte()或viewStub.setVisibility(View.VISIBLE)来完成;

2.正确把握住ViewStub的应用场景非常重要,正如如1中所描述需求场景下,使用ViewStub可以优化布局;

3.对ViewStub的inflate操作只能进行一次,因为inflate的时候是将其指向的布局文件解析inflate并替换掉当前ViewStub本身(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的布局文件中就没有ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息:ViewStub must have a non-null ViewGroup viewParent。

4.3中所讲到的ViewStub指向的布局文件解析inflate并替换掉当前ViewStub本身,并不是完全意义上的替换(与include标签还不太一样),替换时,布局文件的layout params是以ViewStub为准,其他布局属性是以布局文件自身为准。

下面看一下简单的需求场景:在listview显示列表数据时,可能会出现服务端一条数据都没有的情况,此时显示一个EmptyView,提示用户暂无数据。此时考虑到实际应用中EmptyView显示出来的机会相当小,因此,可以在布局文件中使用ViewStub站位,然后确实没有数据时才viewStub.infalte()。

相关部分代码如下:

public void showEmptyView() {
  listview.setVisibility(View.GONE);
  if (noDataView == null) {
    ViewStub noDataViewStub = (ViewStub) view.findViewById(R.id.no_data_viewstub);
    noDataView = noDataViewStub.inflate();
  } else {
    noDataView.setVisibility(View.VISIBLE);
  }
}

public void showListView(){
  listview.setVisibility(View.VISIBLE);
  if(noDataView != null){
    noDataView.setVisibility(View.GONE);
  }
}

特别需要注意的是对ViewStub是否已经inflate的判断。

在Listview Item中,有时候可能遇到如下场景:在不同的列表页item的布局一部分不同,但相对于整个item布局来说又不是很多,此时最常见的有如下两种处理:

1.对不同的部分都写出来,放到一个item文件中,然后逻辑分别处理不同部分的显示与否(View.VISIBLE和View.GONE);

2.对这两种不同的item整个部分都分别区分开,完全写成两个item文件,然后结合listView显示不同布局分别做逻辑处理(通过getItemType()等方式)。

以上两种处理方式其实都可以,第一种方式逻辑清晰,非常灵活,只是在一定程度上增加了内存和资源消耗。第二种方式是的布局文件有重复(虽然相同部分可以通过include,但是逻辑上还是有重复的),包括逻辑上处理的代码实质上的重复。一般对于有较大不同的item布局推荐采用此种方式。

有时候结合需求,可以在第一种方式的基础上,结合ViewStub“占位符”可以比较好的完成此类需求。也相当于是两种方式的一种折中形式,但同时兼顾了内存和资源消耗以及不同的布局逻辑控件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Kotlin Fragment使用方法详解

    Kotlin Fragment使用方法详解

    Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段
    2023-01-01
  • Android 中Popwindow弹出菜单的两种方法实例

    Android 中Popwindow弹出菜单的两种方法实例

    这篇文章主要介绍了Android 中Popwindow弹出菜单的两种方法实例的相关资料,这里提供了两种实现的方法,并附有实例代码,需要的朋友可以参考下
    2017-03-03
  • Android实现IM多人员组合的群组头像

    Android实现IM多人员组合的群组头像

    这篇文章主要为大家详细介绍了Android实现IM多人员组合的群组头像,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Android 欢迎全屏图片详解及实例代码

    Android 欢迎全屏图片详解及实例代码

    这篇文章主要介绍了Android 欢迎全屏图片详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • 详解Flutter的路由导航

    详解Flutter的路由导航

    这篇文章主要介绍了Flutter的路由导航的相关资料,帮助大家更好的理解和学习使用Flutter,感兴趣的朋友可以了解下
    2021-04-04
  • Android防止按钮过快点击造成多次事件的解决方法

    Android防止按钮过快点击造成多次事件的解决方法

    这篇文章主要介绍了Android防止按钮过快点击造成多次事件的解决方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • Android拆轮子系列之写验证码控件的方法

    Android拆轮子系列之写验证码控件的方法

    这篇文章主要介绍了Android拆轮子系列之写验证码控件的方法的, 涉及到Canvas和pint的使用和View的基本用法等相关知识点,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2016-10-10
  • Android PopupWindow增加半透明蒙层

    Android PopupWindow增加半透明蒙层

    这篇文章主要为大家详细介绍了Android PopupWindow增加半透明蒙层,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • RxJava+Retrofit实现网络请求封装的方法

    RxJava+Retrofit实现网络请求封装的方法

    Retrofit是当前应用非常广泛的网络请求框架,通常结合RxJava来进行网络请求,本文将展示一个采用RxJava+Retrofit的网络请求demo,感兴趣的可以了解一下
    2019-04-04
  • Android 中 Swipe、Scroll 和 Fling 的区别解析

    Android 中 Swipe、Scroll 和 Fling 的区别解

    Swipe、Scroll和Fling是Android中常见的触摸手势,它们在用户体验和技术实现上各有特点,Swipe用于快速切换,Scroll用于连续滚动,Fling用于实现惯性滚动,开发者可以根据需求选择合适的手势类型,并结合GestureDetector等工具实现各种交互效果,感兴趣的朋友跟随小编一起看看吧
    2024-12-12

最新评论