测试8.5

来源:互联网 发布:软件部门职责说明书 编辑:程序博客网 时间:2024/06/05 11:37
介绍
--

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

优点
--

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

缺点
--

ViewStub所要替代的layout文件中不能有`<merge>`标签
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>


```

```
<!-- act_test_viewstub.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"/>

    <!--<include-->
        <!--android:layout_width="wrap_content"-->
        <!--android:layout_height="wrap_content"-->
        <!--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);
                    }
                }
            }
        });

    }
}

```

![这里写图片描述](http://img.blog.csdn.net/20170801201410503?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU5MDAwNDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
原创粉丝点击