• ViewStub


    在书上了解了ViewStub,但只是带过两笔,没能了解。在网上搜索了一些资料,虽然很多文章都讲得比较完善,但是觉得可能是表达的原因,导致某个点上我理解错误,慢慢的才算比较清楚的认识ViewStub。

    首先ViewStub的特点,是属于性能优化的控件。ViewStub占用内存少,真真实实的存在于布局文件中,但是ViewStub所占用的内存很少很少。并且ViewStub可以存放一个布局“xml”,当你在必要的时候可以将布局填充到屏幕中。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:tools="http://schemas.android.com/tools"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:paddingLeft="@dimen/activity_horizontal_margin"
                    android:paddingRight="@dimen/activity_horizontal_margin"
                    android:paddingTop="@dimen/activity_vertical_margin"
                    android:paddingBottom="@dimen/activity_vertical_margin"
                    tools:context=".ViewStubActivity">
    
        <ToggleButton
        android:id="@+id/ViewStubButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textOff="ShowViewStub"
        android:textOn="Close"
        />
    
        <ViewStub
            android:id="@+id/ViewStub"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout="@layout/showimageview"
            />
    </RelativeLayout>
    

    看看上面的布局文件,注意ViewStub,其中一个重要的属性就是"android:layout="作用是指定一个需要填充的布局。而这个布局它会替换掉ViewStub,但是ViewStub的width、heigh属性会替换掉这个布局的相应属性。替换掉(inflat)后,ViewStub就相当于消失了。

    下面通过所有代码来看看:

    <?xml version="1.0" encoding="utf-8"?>
    <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:background="@android:drawable/btn_dialog"
               android:id="@+id/imageview">
    
    </ImageView>
    
    public class ViewStubActivity extends ActionBarActivity {
        private ToggleButton mViewStubButton;
        private View nNoDataView ;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_view_stub);
            mViewStubButton= (ToggleButton) findViewById(R.id.ViewStubButton);
            mViewStubButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(isChecked){
                        if(nNoDataView==null) {//这个判断很重要,保证ViewStub不被inflate()两次
                            ViewStub  mViewStub= (ViewStub) findViewById(R.id.ViewStub);
                            nNoDataView=mViewStub.inflate();//通过inflate()填充布局
                            ImageView imageview= (ImageView)nNoDataView.findViewById(R.id.imageview);
                        }
                        else{
                            nNoDataView.setVisibility(View.VISIBLE);
                        }
    
                    }else{
                        nNoDataView.setVisibility(View.GONE);
                    }
                }
            });
    
        }
    
    }



     注意:1、ViewStub在一个Activity中只能被inflate()一次,否则会报错,所以使用View一定要注意好这一点。
       2、假如第一次使用ViewStub.setVisibility(View.VISIBLE)。会调用inflate();要是之后再调用inflate()会报错的。第二次使用ViewStub.setVisibility(View.VISIBLE不会再调用inflate()
       3、对ViewStub调用inflate()后,ViewStub就会被替换掉,它的id都不再存在,若再一次ViewStub mViewStub= (ViewStub) findViewById(R.id.ViewStub);这个mViewStub为空。

      

  • 相关阅读:
    用循环链表求解约瑟夫问题
    Nim游戏变种——取纽扣游戏
    POJ-2726-Holiday Hotel
    常用排序算法总结(二)
    常用排序算法总结(一)
    找出数组中出现次数最多的那个数——主元素问题
    C99新特性:变长数组(VLA)
    linux tftp配置 (Ubuntu18.04)
    Ubuntu 18.04安装Samba服务器及配置
    记录学习Linux遇到的问题
  • 原文地址:https://www.cnblogs.com/caoRM/p/4649792.html
Copyright © 2020-2023  润新知