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 * <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" /> 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