ViewStub.java revision b6af533114cfa5a4547990e79e96bd0402c47e72
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Predaimport java.lang.ref.WeakReference;
27b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A ViewStub is an invisible, zero-sized View that can be used to lazily inflate
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout resources at runtime.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a ViewStub is made visible, or when {@link #inflate()}  is invoked, the layout resource
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is inflated. The ViewStub then replaces itself in its parent with the inflated View or Views.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Therefore, the ViewStub exists in the view hierarchy until {@link #setVisibility(int)} or
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #inflate()} is invoked.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The inflated View is added to the ViewStub's parent with the ViewStub's layout
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters. Similarly, you can define/override the inflate View's id by using the
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ViewStub's inflatedId property. For instance:
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     &lt;ViewStub android:id="@+id/stub"
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:inflatedId="@+id/subTree"
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:layout="@layout/mySubTree"
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:layout_width="120dip"
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:layout_height="40dip" /&gt;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ViewStub thus defined can be found using the id "stub." After inflation of
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the layout resource "mySubTree," the ViewStub is removed from its parent. The
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * View created by inflating the layout resource "mySubTree" can be found using the
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * id "subTree," specified by the inflatedId property. The inflated View is finally
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * assigned a width of 120dip and a height of 40dip.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The preferred way to perform the inflation of the layout resource is the following:
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ViewStub stub = (ViewStub) findViewById(R.id.stub);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     View inflated = stub.inflate();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When {@link #inflate()} is invoked, the ViewStub is replaced by the inflated View
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the inflated View is returned. This lets applications get a reference to the
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated View without executing an extra findViewById().
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_inflatedId
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_layout
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class ViewStub extends View {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mLayoutResource = 0;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mInflatedId;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda    private WeakReference<View> mInflatedViewRef;
74b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnInflateListener mInflateListener;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewStub(Context context) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initialize(context);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new ViewStub with the specified layout resource.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The application's environment.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResource The reference to a layout resource that will be inflated.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewStub(Context context, int layoutResource) {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutResource = layoutResource;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initialize(context);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewStub(Context context, AttributeSet attrs) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, attrs, 0);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings({"UnusedDeclaration"})
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewStub(Context context, AttributeSet attrs, int defStyle) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ViewStub,
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                defStyle, 0);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInflatedId = a.getResourceId(R.styleable.ViewStub_inflatedId, NO_ID);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutResource = a.getResourceId(R.styleable.ViewStub_layout, 0);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View, defStyle, 0);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mID = a.getResourceId(R.styleable.View_id, NO_ID);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initialize(context);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void initialize(Context context) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setVisibility(GONE);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setWillNotDraw(true);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the id taken by the inflated view. If the inflated id is
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link View#NO_ID}, the inflated view keeps its original id.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A positive integer used to identify the inflated view or
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #NO_ID} if the inflated view should keep its id.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setInflatedId(int)
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#ViewStub_inflatedId
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getInflatedId() {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mInflatedId;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Defines the id taken by the inflated view. If the inflated id is
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link View#NO_ID}, the inflated view keeps its original id.
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inflatedId A positive integer used to identify the inflated view or
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   {@link #NO_ID} if the inflated view should keep its id.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getInflatedId()
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#ViewStub_inflatedId
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInflatedId(int inflatedId) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInflatedId = inflatedId;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the layout resource that will be used by {@link #setVisibility(int)} or
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #inflate()} to replace this StubbedView
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in its parent by another view.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The layout resource identifier used to inflate the new View.
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setLayoutResource(int)
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVisibility(int)
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #inflate()
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#ViewStub_layout
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getLayoutResource() {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLayoutResource;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specifies the layout resource to inflate when this StubbedView becomes visible or invisible
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or when {@link #inflate()} is invoked. The View created by inflating the layout resource is
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * used to replace this StubbedView in its parent.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param layoutResource A valid layout resource identifier (different from 0.)
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getLayoutResource()
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVisibility(int)
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #inflate()
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#ViewStub_layout
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLayoutResource(int layoutResource) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutResource = layoutResource;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setMeasuredDimension(0, 0);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dispatchDraw(Canvas canvas) {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE},
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #inflate()} is invoked and this StubbedView is replaced in its parent
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the inflated layout resource.
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}.
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #inflate()
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVisibility(int visibility) {
203b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda        if (mInflatedViewRef != null) {
204b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            View view = mInflatedViewRef.get();
205b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            if (view != null) {
206b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda                view.setVisibility(visibility);
207b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            } else {
208b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda                throw new IllegalStateException("setVisibility called on un-referenced view");
209b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            }
210b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda        } else if (visibility == VISIBLE || visibility == INVISIBLE) {
211b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda            super.setVisibility(visibility);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            inflate();
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inflates the layout resource identified by {@link #getLayoutResource()}
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and replaces this StubbedView in its parent by the inflated layout resource.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The inflated layout resource.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View inflate() {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewParent viewParent = getParent();
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (viewParent != null && viewParent instanceof ViewGroup) {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mLayoutResource != 0) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ViewGroup parent = (ViewGroup) viewParent;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final LayoutInflater factory = LayoutInflater.from(mContext);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final View view = factory.inflate(mLayoutResource, parent,
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mInflatedId != NO_ID) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    view.setId(mInflatedId);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int index = parent.indexOfChild(this);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                parent.removeViewInLayout(this);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ViewGroup.LayoutParams layoutParams = getLayoutParams();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (layoutParams != null) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parent.addView(view, index, layoutParams);
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    parent.addView(view, index);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
247b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda                mInflatedViewRef = new WeakReference(view);
248b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mInflateListener != null) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mInflateListener.onInflate(this, view);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return view;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException("ViewStub must have a valid layoutResource");
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specifies the inflate listener to be notified after this ViewStub successfully
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflated its layout resource.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inflateListener The OnInflateListener to notify of successful inflation.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.ViewStub.OnInflateListener
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnInflateListener(OnInflateListener inflateListener) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInflateListener = inflateListener;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Listener used to receive a notification after a ViewStub has successfully
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inflated its layout resource.
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.ViewStub#setOnInflateListener(android.view.ViewStub.OnInflateListener)
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface OnInflateListener {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Invoked after a ViewStub successfully inflated its layout resource.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This method is invoked after the inflated view was added to the
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * hierarchy but before the layout pass.
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param stub The ViewStub that initiated the inflation.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param inflated The inflated View.
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onInflate(ViewStub stub, View inflated);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
292