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是一个轻量级的控件,常用于实现动态加载和延迟加载。这个控件在默认情况下不占用布局空间,且不可见。只有当被 inflated(加载)时,它才会占据布局中的位置,并显示其中的视图。这种特性...
ViewStub是Android开发中一种特殊的轻量级控件,它在布局文件中占用的空间为0,不会参与初始化时的视图构建,直到被显式地`inflate`或设置了`android:layout_width`和`android:layout_height`属性后才会被加载。...
在Android开发中,动态加载布局和控件是提高应用灵活性和效率的重要技术。这两个demo例子分别展示了如何实现这两种功能,让我们深入探讨一下它们的核心概念和实现方式。 首先,动态加载布局指的是在运行时根据需要...
ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View。虽然Android开发人员基本上都听说过,但是真正用的可能不多。 ViewStub可以理解成一个非常轻量级的View,与其他的控件一样,有着自己的属性及...
在Android开发中,ViewStub是一个轻量级的组件,它在初始加载时占用的资源非常少,主要用于延迟加载和动态插入布局。ViewStub在XML布局文件中定义,但默认情况下它是不可见的,不会占据任何空间,直到被显式地设置为...
动态添加控件允许开发者在运行时根据需要创建和添加组件,而ViewStub则是一种轻量级的视图,用于延迟加载布局。下面将详细介绍这两个概念及其应用。 首先,我们来探讨动态添加控件。在Android中,通常我们会在XML...
### 弹性ListView控件的实现 #### 功能与效果 ...总之,`ViewStub`控件为Android开发提供了强大的布局管理能力,尤其是在需要根据运行时条件动态加载不同布局的情况下,能够显著提高应用的灵活性和性能。
它是一个轻量级的视图,主要用于延迟加载和初始化视图。在本文中,我们将深入理解`ViewStub`的工作原理,以及如何在实际项目中使用它。 **一、ViewStub的基本概念** `ViewStub` 是Android SDK提供的一种特殊的视图...
总结来说,DataBinding结合ViewStub可以让我们在Android应用开发中更高效地管理视图,实现延迟加载和动态添加视图的功能,同时保持代码的整洁和易于维护。合理利用这两个工具,可以显著提升应用的用户体验和开发效率...
ViewStub是一个轻量级的视图组件,它在布局文件中占用极小的资源,主要用于延迟加载和动态插入布局。本篇文章将详细探讨ViewStub的使用方法及其在UI优化中的作用。 **一、ViewStub的基本概念** ViewStub是一个不...
ViewStub在Android开发中是一个非常实用的轻量级组件,常用于延迟加载或者动态加载一些不常用但必不可少的UI元素。这个组件默认是不可见的,并且占据的布局空间几乎可以忽略不计,直到被激活时才会加载并显示在界面...
- ViewStub有两个关键属性:`android:layout`和`android:inflatedId`,分别用于指定要加载的布局资源ID和加载后视图的ID。 2. **在ListView中使用ViewStub** - 当ListView项需要根据特定条件显示或隐藏某些复杂...
1、静态加载:被加载的模块和其它模块加载的时间一样。 <include layout=@layout/otherLayout/> 2、动态加载:需要被加载的模块初始时并没有被加载进内存,在你需要加载这个模块才会被动态的加载进去。 ...
在Android开发中,ViewStub是一个轻量级的组件,它在布局文件中占用的空间为0,不会参与初始化时的视图加载。ViewStub通常用于延迟加载或者动态插入视图,尤其适用于实现页面状态的动态切换,如空状态、错误状态、...
使用ViewStub可以提高应用的性能,因为它允许你只在需要时才加载和初始化额外的视图,减少了内存消耗和UI渲染时间。 5. **注意点**: - ViewStub加载的布局不能包含根节点,否则会导致运行时错误。 - ViewStub的...
综上所述,`UI_include_merge_ViewStub`这个主题涵盖了Android布局优化的关键技术,包括布局重用、减少视图层级和延迟加载。理解并熟练运用这些技巧,对于提升Android应用的开发质量和效率有着显著的帮助。在实践...
2. **getVisibility()**和**setVisibility()**:虽然ViewStub在加载后通常不再需要,但你仍然可以获取其可见性状态或改变它,尽管这对新加载的布局没有直接影响。 3. **setOnInflateListener()**:可以通过设置监听...
ViewStub的设计理念是实现控件的惰性装载,即在需要时才加载和初始化视图,而不是在应用启动时一次性加载所有布局。这在处理大型布局或者有多个可选组件的情况下尤其重要。 在传统的布局文件中,如使用<include>...
这种特性使得`ViewStub`适用于动态加载和条件显示的场景,如加载复杂的表单或对话框。例如: ```xml <ViewStub android:id="@+id/stub" android:layout_width="wrap_content" android:layout_height="wrap_...