`

ViewStub惰加载控件和include

 
阅读更多

 

1 ViewStub,惰性装载控件,可以在程序运行的过程中,通过懒加载的模式inflate(即在程序中调用inflate方法)进入布局资源中。

2 使用场景:程序初始化的时候不需要加载,在用户操作过程中根据用户需求加载(好处:加快程序初始化速度)

3 使用方法:第一次操作调用控件的inflate或setVisibility方法,控件可以显示,想要第二次显示的话只能调用 setVisibility方法

4 个人理解:与include功能相同即将另一个布局引入到当前布局中,

二者不同:include会直接加载另一个组件,但ViewStub只有调用才会加载()

 

 例子代码:

1 Activity 

  

public class ViewStubActivity extends Activity {
	private Button btn1, btn2, btn3;
	private ViewStub viewStub;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_view_stub);

		// 获取控件,绑定事件
		btn1 = (Button) findViewById(R.id.btn1);
		btn2 = (Button) findViewById(R.id.btn2);
		btn3 = (Button) findViewById(R.id.btn3);

		viewStub = (ViewStub) findViewById(R.id.stub);
		viewStub.setOnInflateListener(inflateListener);

		btn1.setOnClickListener(click);
		btn2.setOnClickListener(click);
		btn3.setOnClickListener(click);
	}

	private OnInflateListener inflateListener = new OnInflateListener() {

		@Override
		public void onInflate(ViewStub stub, View inflated) {
			// inflaye ViewStub的时候显示
			Toast.makeText(ViewStubActivity.this, "ViewStub is loaded!",
					Toast.LENGTH_SHORT).show();
		}
	};
	private View.OnClickListener click = new OnClickListener() {
		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.btn1:
				try {
					// 如果没有被inflate过,使用inflate膨胀
					LinearLayout layout = (LinearLayout) viewStub.inflate();
					RatingBar bar = (RatingBar) layout
							.findViewById(R.id.ratingBar1);
					bar.setNumStars(4);
				} catch (Exception e) {
					// 如果使用inflate膨胀报错,就说明已经被膨胀过了,使用setVisibility方法显示
					viewStub.setVisibility(View.VISIBLE);
				}
				break;

			case R.id.btn2:
				// 隐藏ViewStub
				viewStub.setVisibility(View.GONE);
				break;
			case R.id.btn3:
				// 操作被inflate的控件,需要得到当前布局的对象
				// 然后通过这个对象去找到被inflate的控件。
				// 因为否则在这个示例中,会找到include标签引入的控件
				LinearLayout linearLayout = (LinearLayout) findViewById(R.id.inflatedStart);
				RatingBar rBar = (RatingBar) linearLayout
						.findViewById(R.id.ratingBar1);
				float numStart = rBar.getRating();
				numStart++;
				if (numStart > 4) {
					numStart = 0;
				}
				rBar.setRating(numStart);
				break;
			}
		}
	};
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}

 2 xml布局 ,有include的使用和ViewStub控件的使用

  

<LinearLayout 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:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.layoutproperty.ViewStubActivity" >
    <!-- 使用include标签加载一个id为activity_view_stub_rat的控件 -->
    <include
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        layout="@layout/activity_view_stub_rat" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FFCCDD"
        android:orientation="vertical" >
        <!-- 定义一个ViewStub 给其父Layout指定Id为inflatedStart,引入activity_view_stub_rat布局动态装载 -->
        <ViewStub
            android:id="@+id/stub"
            android:inflatedId="@+id/inflatedStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout="@layout/activity_view_stub_rat" />
    </LinearLayout>

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="动态添加布局" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="动态隐藏布局" />
    <Button
        android:id="@+id/btn3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="操作StubInflate的控件" />
</LinearLayout>

 3 包含近来的布局组件 activity_view_stub_rat.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:orientation="vertical" >
    <RatingBar
        android:id="@+id/ratingBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

 

 

 

分享到:
评论

相关推荐

    Android下使用ViewStub控件加载

    在Android开发中,ViewStub是一个轻量级的控件,常用于实现动态加载和延迟加载。这个控件在默认情况下不占用布局空间,且不可见。只有当被 inflated(加载)时,它才会占据布局中的位置,并显示其中的视图。这种特性...

    惰性控件ViewStub实现布局东动态加载

    ViewStub是Android开发中一种特殊的轻量级控件,它在布局文件中占用的空间为0,不会参与初始化时的视图构建,直到被显式地`inflate`或设置了`android:layout_width`和`android:layout_height`属性后才会被加载。...

    实现动态加载布局和动态加载控件的两个demo例子

    在Android开发中,动态加载布局和控件是提高应用灵活性和效率的重要技术。这两个demo例子分别展示了如何实现这两种功能,让我们深入探讨一下它们的核心概念和实现方式。 首先,动态加载布局指的是在运行时根据需要...

    Android布局优化之ViewStub控件

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View。虽然Android开发人员基本上都听说过,但是真正用的可能不多。 ViewStub可以理解成一个非常轻量级的View,与其他的控件一样,有着自己的属性及...

    ViewStub利用ViewStub显示和隐藏布局

    在Android开发中,ViewStub是一个轻量级的组件,它在初始加载时占用的资源非常少,主要用于延迟加载和动态插入布局。ViewStub在XML布局文件中定义,但默认情况下它是不可见的,不会占据任何空间,直到被显式地设置为...

    动态添加控件和ViewStub的使用例子

    动态添加控件允许开发者在运行时根据需要创建和添加组件,而ViewStub则是一种轻量级的视图,用于延迟加载布局。下面将详细介绍这两个概念及其应用。 首先,我们来探讨动态添加控件。在Android中,通常我们会在XML...

    弹性ListView控件的实现 和 ViewStub 控件的应用

    ### 弹性ListView控件的实现 #### 功能与效果 ...总之,`ViewStub`控件为Android开发提供了强大的布局管理能力,尤其是在需要根据运行时条件动态加载不同布局的情况下,能够显著提高应用的灵活性和性能。

    ViewStub的简单Demo

    它是一个轻量级的视图,主要用于延迟加载和初始化视图。在本文中,我们将深入理解`ViewStub`的工作原理,以及如何在实际项目中使用它。 **一、ViewStub的基本概念** `ViewStub` 是Android SDK提供的一种特殊的视图...

    DataBinding中ViewStub例子

    总结来说,DataBinding结合ViewStub可以让我们在Android应用开发中更高效地管理视图,实现延迟加载和动态添加视图的功能,同时保持代码的整洁和易于维护。合理利用这两个工具,可以显著提升应用的用户体验和开发效率...

    Android UI优化之ViewStub标签的使用

    ViewStub是一个轻量级的视图组件,它在布局文件中占用极小的资源,主要用于延迟加载和动态插入布局。本篇文章将详细探讨ViewStub的使用方法及其在UI优化中的作用。 **一、ViewStub的基本概念** ViewStub是一个不...

    ViewStub的简单使用

    ViewStub在Android开发中是一个非常实用的轻量级组件,常用于延迟加载或者动态加载一些不常用但必不可少的UI元素。这个组件默认是不可见的,并且占据的布局空间几乎可以忽略不计,直到被激活时才会加载并显示在界面...

    ListView之ViewStub的使用

    - ViewStub有两个关键属性:`android:layout`和`android:inflatedId`,分别用于指定要加载的布局资源ID和加载后视图的ID。 2. **在ListView中使用ViewStub** - 当ListView项需要根据特定条件显示或隐藏某些复杂...

    Android在layout xml中使用ViewStub完成动态加载问题

     1、静态加载:被加载的模块和其它模块加载的时间一样。   &lt;include layout=@layout/otherLayout/&gt;  2、动态加载:需要被加载的模块初始时并没有被加载进内存,在你需要加载这个模块才会被动态的加载进去。  ...

    Android ViewStub 页面状态动态切换

    在Android开发中,ViewStub是一个轻量级的组件,它在布局文件中占用的空间为0,不会参与初始化时的视图加载。ViewStub通常用于延迟加载或者动态插入视图,尤其适用于实现页面状态的动态切换,如空状态、错误状态、...

    ViewStub的使用简单示例

    使用ViewStub可以提高应用的性能,因为它允许你只在需要时才加载和初始化额外的视图,减少了内存消耗和UI渲染时间。 5. **注意点**: - ViewStub加载的布局不能包含根节点,否则会导致运行时错误。 - ViewStub的...

    UI_include_merge_ViewStub

    综上所述,`UI_include_merge_ViewStub`这个主题涵盖了Android布局优化的关键技术,包括布局重用、减少视图层级和延迟加载。理解并熟练运用这些技巧,对于提升Android应用的开发质量和效率有着显著的帮助。在实践...

    ViewStub demo

    2. **getVisibility()**和**setVisibility()**:虽然ViewStub在加载后通常不再需要,但你仍然可以获取其可见性状态或改变它,尽管这对新加载的布局没有直接影响。 3. **setOnInflateListener()**:可以通过设置监听...

    Android开发技巧之ViewStub控件惰性装载

    ViewStub的设计理念是实现控件的惰性装载,即在需要时才加载和初始化视图,而不是在应用启动时一次性加载所有布局。这在处理大型布局或者有多个可选组件的情况下尤其重要。 在传统的布局文件中,如使用&lt;include&gt;...

    Android布局技巧之include、merge与ViewStub标签的巧用

    这种特性使得`ViewStub`适用于动态加载和条件显示的场景,如加载复杂的表单或对话框。例如: ```xml &lt;ViewStub android:id="@+id/stub" android:layout_width="wrap_content" android:layout_height="wrap_...

Global site tag (gtag.js) - Google Analytics