你的位置:首页 > 操作系统

[操作系统]延迟加载和插入视图


当我们需要为App中的每个View都添加一个header或者footer时,你会怎么做?

重复地复制粘贴可以解决这个问题,但未免太繁杂。可以试着使用<include />标签:

 

第一种方式,在<include />标签内指定width及height:

main.<RelativeLayout = "http://schemas.android.com/apk/res/android" android:layout_width= "fill_parent" android:layout_height= "fill_parent" > <Button android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:layout_gravity ="center_vertical" android:onClick ="onShowMap" android:text ="@string/show_map" /> <include layout ="@layout/footer" /></RelativeLayout>
footer.<TextView = "http://schemas.android.com/apk/res/android" android:layout_width= "fill_parent" android:layout_height= "wrap_content" android:layout_alignParentBottom= "true" android:layout_marginBottom= "30dp" android:gravity= "center" android:text= "@string/footer_text" />

二、利用ViewStub类来延迟加载视图

在设计视图时,有时会考虑到某些视图的可见性是依赖于用户的操作或者运行设备的具体环境的。

此时你会如何设计?仅仅是改变View的visible属性?

我们先来看看ViewStub的介绍:

 

ViewStub是一个不可见、不占空间(zero-sized)的控件,它可以用来在运行时延迟加载视图资源。只有当我们将ViewStub的可见性设为true,或者调用inflate()方法,它的视图资源才会被加载。

 

假设我们设计的一个页面中包含地图View,试想一下以下这种情况:

     有些用户不需要看到地图。

既然用户不需要看到地图,我们为何还坚持不懈地加载它?这反而影响了我们App的Performance。

此时,我们就可以利用ViewStub类了:

main.<RelativeLayout = "http://schemas.android.com/apk/res/android" android:layout_width= "fill_parent" android:layout_height= "fill_parent" > <Button android:layout_width ="fill_parent" android:layout_height ="wrap_content" android:layout_gravity ="center_vertical" android:onClick ="onShowMap" android:text ="@string/show_map" /> <ViewStub android:id ="@+id/map_stub" android:layout_width ="fill_parent" android:layout_height ="fill_parent" android:inflatedId ="@+id/map_view" android:layout ="@layout/map" /></RelativeLayout>

map.

<com.google.android.maps.MapView ="http://schemas.android.com/apk/res/android"  android:layout_width= "fill_parent"  android:layout_height= "fill_parent"  android:apiKey= "my_api_key"  android:clickable= "true" />

接下来看看MainActivity

public class MainActivity extends MapActivity { private View mViewStub; @Override public void onCreate (Bundle savedInstanceState ) {  super. onCreate( savedInstanceState );  setContentView( R. layout. main);  mViewStub = findViewById( R. id. map_stub); } public void onShowMap (View v) {  mViewStub. setVisibility (View .VISIBLE ); }....}

如你所见,在需要显示图像时我们才调用onShowMap来改变map_stub的可见性。在改变之前,map_stub都不会渲染加载视图资源。

小结:

     1.当我们的页面变得复杂,

     2.ViewStub是一个极佳的延迟加载视图资源的方式。只要你设计的视图是依赖于上下文来改变其可见性的,就利用ViewStub类吧。也许当你只将其应用在一个简单的页面当中时,并不会感觉到在性能上有任何提升,但是在复杂页面中,它的效果是极佳的。