Android布局总结二:ViewStub总结

来源:互联网 发布:现在开淘宝店好做吗 编辑:程序博客网 时间:2024/06/05 10:38

简介

ViewStub是一个轻量级的的View,继承于ViewGroup,没有任何尺寸,不绘制任何东西,因此绘制或者移除时更省时。(ViewStub不可见,大小为0)

优点

实现View的延迟加载,避免资源的浪费,减少渲染时间,在需要的时候才加载View

缺点

  • ViewStub所要替代的layout文件中不能有标签
  • ViewStub在加载完后会被移除,或者说是被加载进来的layout替换掉了

用法

    <ViewStub                                           android:id="@+id/stub_import"                       android:inflatedId="@+id/panel_import"                    android:layout="@layout/progress_overlay"        android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:layout_gravity="bottom" />

用ViewStub加载layout文件时,可以调用 setVisibility(View.VISIBLE)或者inflate()

((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE); // or View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

注意

  • 一旦ViewStub visible/inflated,则ViewStub将从视图框架中移除,其id stub_import也会失效
  • ViewStub被绘制完成的layout文件取代,并且该layout文件的root view的id是android:inflatedId指定的id panel_import,root view的布局和ViewStub视图的布局保持一致

实例

<!-- layout_viewstub.xml 要延迟加载的view --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout         android:id="@+id/layout_viewstub_old"         xmlns:android="http://schemas.android.com/apk/res/android"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:orientation="vertical">         <TextView             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_margin="5dp"             android:background="@android:color/darker_gray"            android:padding="5dp"            android:text="This is the layout instead of ViewStub view."/> </LinearLayout>
<!-- main.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout     xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent"    android:gravity="center_horizontal"    android:orientation="vertical">     <TextView         android:id="@+id/act_test_viewstub_tv_show"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_margin="5dp"        android:background="@android:color/darker_gray"        android:padding="5dp"        android:text="Show ViewStub"/>     <ViewStub         android:id="@+id/act_test_viewstub_viewstub"         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:inflatedId="@+id/act_layout_viewstub_new"         android:layout="@layout/layout_viewstub"/> </LinearLayout>
public class ViewStubTestActivity extends FragmentActivity {     private static final String TAG = "test_viewstub";     protected ViewStub mViewStub;     @Override     protected void onCreate(@Nullable Bundle savedInstanceState)     {         super.onCreate(savedInstanceState);         setContentView(R.layout.act_test_viewstub);         mViewStub = (ViewStub) findViewById(R.id.act_test_viewstub_viewstub);         Log.e(TAG, "viewstub: " + findViewById(R.id.act_test_viewstub_viewstub));         Log.e(TAG, "layout: " + findViewById(R.id.act_layout_viewstub_new));        findViewById(R.id.act_test_viewstub_tv_show).setOnClickListener(new View.OnClickListener()         {            @Override            public void onClick(View v)             {                 View layoutView;                 // mViewStub.setVisibility(View.VISIBLE);                 layoutView = mViewStub.inflate();                 Log.e(TAG, "mViewStub: " + mViewStub);                 // ViewStub在visible/inflated后会被移除,所以此处为null                 Log.e(TAG, "viewstub: " + findViewById(R.id.act_test_viewstub_viewstub));                 // layoutView = findViewById(R.id.act_layout_viewstub_new);                 Log.e(TAG, "layoutView equals finviewbyid(layout): " + layoutView.equals(findViewById(R.id.act_layout_viewstub_new)));                 Log.e(TAG, "layout: " + layoutView);                 if (layoutView != null)                 {                     // / layoutView的root view id 是mViewStub inflatedId指定的ID                     if (layoutView.getId() == R.id.act_layout_viewstub_new)                     {                        Log.e(TAG, "layout root id is act_layout_viewstub_new");                     }                     else if (layoutView.getId() == R.id.layout_viewstub_old)                     {                         Log.e(TAG, "layout root id is layout_viewstub_old");                     } else {                         Log.e(TAG, "layout root id is anyone : " + layoutView.getId());                     }                     // layoutView的root view布局 和mViewStub的布局保持一致                     int width = layoutView.getLayoutParams().width;                     if (width == ViewGroup.LayoutParams.MATCH_PARENT)                     {                         Log.e(TAG, "layout width is MATCH_PARENT");                     }                     else if (width == ViewGroup.LayoutParams.WRAP_CONTENT)                     {                         Log.e(TAG, "layout width is WRAP_CONTENT");                     } else {                         Log.e(TAG, "layout width is anyone : " + width);                     }                 }             }         });     } }

这里写图片描述

原创粉丝点击