最近項目中有需求,需要添加功能引導,如果用戶是第一次使用,那么就顯示功能引導,之后則不再顯示。感覺這樣的需求正好可以利用ViewStub來實現,更節省資源。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > .............. <ViewStub android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/lay_guide" android:layout="@layout/guide_main_tab"/> </RelativeLayout>
if(!GuidePreference.isGuide(getApplicationContext(), GuidePreference.MAIN_TAB_V4)){ ViewStub stub = (ViewStub) findViewById(R.id.lay_guide); if(stub==null){ return ; } mFilpper = (ViewFlipper) stub.inflate() ; mFilpper.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { guideSwitch() ; } }); }
查看ViewStub的源碼,inflate()部分如下:
public View inflate() { final ViewParent viewParent = getParent(); if (viewParent != null && viewParent instanceof ViewGroup) { if (mLayoutResource != 0) { final ViewGroup parent = (ViewGroup) viewParent; final LayoutInflater factory; if (mInflater != null) { factory = mInflater; } else { factory = LayoutInflater.from(mContext); } final View view = factory.inflate(mLayoutResource, parent, false); if (mInflatedId != NO_ID) { view.setId(mInflatedId); } final int index = parent.indexOfChild(this); parent.removeViewInLayout(this); final ViewGroup.LayoutParams layoutParams = getLayoutParams(); if (layoutParams != null) { parent.addView(view, index, layoutParams); } else { parent.addView(view, index); } mInflatedViewRef = new WeakReference<View>(view); if (mInflateListener != null) { mInflateListener.onInflate(this, view); } return view; } else { throw new IllegalArgumentException("ViewStub must have a valid layoutResource"); } } else { throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent"); } }
從以上代碼可以看出,ViewStub其實只相當於一個占位View而已,在未inflate之前,高寬都是0,只保存了在parent中的index和layoutParmas而已,在inflate時,用mLayoutResource來替換掉自己。這比自己平時動態往ViewGroup里面添加view的確要少一些操作,方便多了。