ViewStubpublic final class ViewStub extends View A ViewStub is an invisible, zero-sized View that can be used to lazily inflate
layout resources at runtime.
When a ViewStub is made visible, or when {@link #inflate()} is invoked, the layout resource
is inflated. The ViewStub then replaces itself in its parent with the inflated View or Views.
Therefore, the ViewStub exists in the view hierarchy until {@link #setVisibility(int)} or
{@link #inflate()} is invoked.
The inflated View is added to the ViewStub's parent with the ViewStub's layout
parameters. Similarly, you can define/override the inflate View's id by using the
ViewStub's inflatedId property. For instance:
<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
The ViewStub thus defined can be found using the id "stub." After inflation of
the layout resource "mySubTree," the ViewStub is removed from its parent. The
View created by inflating the layout resource "mySubTree" can be found using the
id "subTree," specified by the inflatedId property. The inflated View is finally
assigned a width of 120dip and a height of 40dip.
The preferred way to perform the inflation of the layout resource is the following:
ViewStub stub = (ViewStub) findViewById(R.id.stub);
View inflated = stub.inflate();
When {@link #inflate()} is invoked, the ViewStub is replaced by the inflated View
and the inflated View is returned. This lets applications get a reference to the
inflated View without executing an extra findViewById(). |
Fields Summary |
---|
private int | mLayoutResource | private int | mInflatedId | private WeakReference | mInflatedViewRef | private LayoutInflater | mInflater | private OnInflateListener | mInflateListener |
Constructors Summary |
---|
public ViewStub(android.content.Context context)
initialize(context);
| public ViewStub(android.content.Context context, int layoutResource)Creates a new ViewStub with the specified layout resource.
mLayoutResource = layoutResource;
initialize(context);
| public ViewStub(android.content.Context context, android.util.AttributeSet attrs)
this(context, attrs, 0);
| public ViewStub(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr)
this(context, attrs, defStyleAttr, 0);
| public ViewStub(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr, int defStyleRes)
TypedArray a = context.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.ViewStub, defStyleAttr, defStyleRes);
mInflatedId = a.getResourceId(R.styleable.ViewStub_inflatedId, NO_ID);
mLayoutResource = a.getResourceId(R.styleable.ViewStub_layout, 0);
a.recycle();
a = context.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);
mID = a.getResourceId(R.styleable.View_id, NO_ID);
a.recycle();
initialize(context);
|
Methods Summary |
---|
protected void | dispatchDraw(android.graphics.Canvas canvas)
| public void | draw(android.graphics.Canvas canvas)
| public int | getInflatedId()Returns the id taken by the inflated view. If the inflated id is
{@link View#NO_ID}, the inflated view keeps its original id.
return mInflatedId;
| public LayoutInflater | getLayoutInflater()Get current {@link LayoutInflater} used in {@link #inflate()}.
return mInflater;
| public int | getLayoutResource()Returns the layout resource that will be used by {@link #setVisibility(int)} or
{@link #inflate()} to replace this StubbedView
in its parent by another view.
return mLayoutResource;
| public View | inflate()Inflates the layout resource identified by {@link #getLayoutResource()}
and replaces this StubbedView in its parent by the inflated layout resource.
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");
}
| private void | initialize(android.content.Context context)
mContext = context;
setVisibility(GONE);
setWillNotDraw(true);
| protected void | onMeasure(int widthMeasureSpec, int heightMeasureSpec)
setMeasuredDimension(0, 0);
| public void | setInflatedId(int inflatedId)Defines the id taken by the inflated view. If the inflated id is
{@link View#NO_ID}, the inflated view keeps its original id.
mInflatedId = inflatedId;
| public void | setLayoutInflater(LayoutInflater inflater)Set {@link LayoutInflater} to use in {@link #inflate()}, or {@code null}
to use the default.
mInflater = inflater;
| public void | setLayoutResource(int layoutResource)Specifies the layout resource to inflate when this StubbedView becomes visible or invisible
or when {@link #inflate()} is invoked. The View created by inflating the layout resource is
used to replace this StubbedView in its parent.
mLayoutResource = layoutResource;
| public void | setOnInflateListener(android.view.ViewStub$OnInflateListener inflateListener)Specifies the inflate listener to be notified after this ViewStub successfully
inflated its layout resource.
mInflateListener = inflateListener;
| public void | setVisibility(int visibility)When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE},
{@link #inflate()} is invoked and this StubbedView is replaced in its parent
by the inflated layout resource. After that calls to this function are passed
through to the inflated view.
if (mInflatedViewRef != null) {
View view = mInflatedViewRef.get();
if (view != null) {
view.setVisibility(visibility);
} else {
throw new IllegalStateException("setVisibility called on un-referenced view");
}
} else {
super.setVisibility(visibility);
if (visibility == VISIBLE || visibility == INVISIBLE) {
inflate();
}
}
|
|