zoukankan      html  css  js  c++  java
  • 安卓ViewStub用法

    安卓ViewStub用法

      在开发应用程序的时候,经常会遇到这样的情况,在运行时动态根据条件来决定显示哪个View或某个布局

    那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。

    这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源

    虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。

      推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。

    可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。

         但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。

         首先来说说ViewStub的一些特点

             1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。

             2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。

         基于以上的特点,那么可以考虑使用ViewStub的情况有:

             1. 在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。

        因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。

        所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。

        这时就只能使用View的可见性来控制了。

             2. 想要控制显示与隐藏的是一个布局文件,而非某个View。

                  因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。

           所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。

    使用方法

    一、

    <ViewStub android:id="@+id/stub"
                   android:inflatedId="@+id/subTree"
                   android:layout="@layout/mySubTree"
                   android:layout_width="120dip"
                   android:layout_height="40dip" />
    ViewStub stub = (ViewStub) findViewById(R.id.stub);
    View inflated = stub.inflate();

    二、

    <ViewStub
            android:id="@+id/stub"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
    private ViewStub stub;
    
    stub = (ViewStub) findViewById(R.id.stub);
    stub.setLayoutResource(R.layout.layout_surface_view);
    View inflated = stub.inflate();
  • 相关阅读:
    给右键 添加dos命令
    js模拟系统无刷新跳回登录页1
    MBProgressHUD.h file not found
    建立个人博客网站
    <转>提高iOS开发效率的方法和工具
    设置模块功能设计思路及代码实现
    经验之谈
    'NSInteger' (aka 'long') to 'int32
    OCR技术
    升级Xcode6.4插件失效解决办法
  • 原文地址:https://www.cnblogs.com/jxust-jiege666/p/7940682.html
Copyright © 2011-2022 走看看