ViewStub.java revision b27b7a152437d6ebb4f2a2700858b69634c00acd
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; 23b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkeyimport android.widget.RemoteViews.RemoteView; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Predaimport java.lang.ref.WeakReference; 28b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A ViewStub is an invisible, zero-sized View that can be used to lazily inflate 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout resources at runtime. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a ViewStub is made visible, or when {@link #inflate()} is invoked, the layout resource 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is inflated. The ViewStub then replaces itself in its parent with the inflated View or Views. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Therefore, the ViewStub exists in the view hierarchy until {@link #setVisibility(int)} or 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #inflate()} is invoked. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The inflated View is added to the ViewStub's parent with the ViewStub's layout 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters. Similarly, you can define/override the inflate View's id by using the 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ViewStub's inflatedId property. For instance: 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre> 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ViewStub android:id="@+id/stub" 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:inflatedId="@+id/subTree" 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:layout="@layout/mySubTree" 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:layout_width="120dip" 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:layout_height="40dip" /> 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ViewStub thus defined can be found using the id "stub." After inflation of 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the layout resource "mySubTree," the ViewStub is removed from its parent. The 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * View created by inflating the layout resource "mySubTree" can be found using the 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * id "subTree," specified by the inflatedId property. The inflated View is finally 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * assigned a width of 120dip and a height of 40dip. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The preferred way to perform the inflation of the layout resource is the following: 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre> 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ViewStub stub = (ViewStub) findViewById(R.id.stub); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * View inflated = stub.inflate(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When {@link #inflate()} is invoked, the ViewStub is replaced by the inflated View 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the inflated View is returned. This lets applications get a reference to the 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated View without executing an extra findViewById(). 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_inflatedId 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_layout 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 70b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey@RemoteView 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class ViewStub extends View { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLayoutResource = 0; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mInflatedId; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 75b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda private WeakReference<View> mInflatedViewRef; 76b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda 77b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey private LayoutInflater mInflater; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnInflateListener mInflateListener; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewStub(Context context) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialize(context); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new ViewStub with the specified layout resource. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The application's environment. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param layoutResource The reference to a layout resource that will be inflated. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewStub(Context context, int layoutResource) { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutResource = layoutResource; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialize(context); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewStub(Context context, AttributeSet attrs) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, 0); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({"UnusedDeclaration"}) 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewStub(Context context, AttributeSet attrs, int defStyle) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ViewStub, 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defStyle, 0); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflatedId = a.getResourceId(R.styleable.ViewStub_inflatedId, NO_ID); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutResource = a.getResourceId(R.styleable.ViewStub_layout, 0); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View, defStyle, 0); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mID = a.getResourceId(R.styleable.View_id, NO_ID); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialize(context); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initialize(Context context) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setVisibility(GONE); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWillNotDraw(true); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the id taken by the inflated view. If the inflated id is 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link View#NO_ID}, the inflated view keeps its original id. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A positive integer used to identify the inflated view or 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #NO_ID} if the inflated view should keep its id. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setInflatedId(int) 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_inflatedId 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInflatedId() { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInflatedId; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defines the id taken by the inflated view. If the inflated id is 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link View#NO_ID}, the inflated view keeps its original id. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param inflatedId A positive integer used to identify the inflated view or 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #NO_ID} if the inflated view should keep its id. 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getInflatedId() 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_inflatedId 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 146b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey @android.view.RemotableViewMethod 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInflatedId(int inflatedId) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflatedId = inflatedId; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the layout resource that will be used by {@link #setVisibility(int)} or 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #inflate()} to replace this StubbedView 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in its parent by another view. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The layout resource identifier used to inflate the new View. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setLayoutResource(int) 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVisibility(int) 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #inflate() 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_layout 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLayoutResource() { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayoutResource; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specifies the layout resource to inflate when this StubbedView becomes visible or invisible 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or when {@link #inflate()} is invoked. The View created by inflating the layout resource is 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used to replace this StubbedView in its parent. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param layoutResource A valid layout resource identifier (different from 0.) 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getLayoutResource() 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setVisibility(int) 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #inflate() 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewStub_layout 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 179b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey @android.view.RemotableViewMethod 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLayoutResource(int layoutResource) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutResource = layoutResource; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 184b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey /** 185b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey * Set {@link LayoutInflater} to use in {@link #inflate()}, or {@code null} 186b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey * to use the default. 187b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey */ 188b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey public void setLayoutInflater(LayoutInflater inflater) { 189b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey mInflater = inflater; 190b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey } 191b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey 192b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey /** 193b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey * Get current {@link LayoutInflater} used in {@link #inflate()}. 194b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey */ 195b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey public LayoutInflater getLayoutInflater() { 196b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey return mInflater; 197b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey } 198b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMeasuredDimension(0, 0); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchDraw(Canvas canvas) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE}, 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #inflate()} is invoked and this StubbedView is replaced in its parent 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the inflated layout resource. 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #inflate() 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 222b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey @android.view.RemotableViewMethod 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVisibility(int visibility) { 224b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda if (mInflatedViewRef != null) { 225b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda View view = mInflatedViewRef.get(); 226b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda if (view != null) { 227b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda view.setVisibility(visibility); 228b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda } else { 229b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda throw new IllegalStateException("setVisibility called on un-referenced view"); 230b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda } 23158acbafcf2263232c4805cf7a39196acf03763d9Adam Powell } else { 232b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda super.setVisibility(visibility); 23358acbafcf2263232c4805cf7a39196acf03763d9Adam Powell if (visibility == VISIBLE || visibility == INVISIBLE) { 23458acbafcf2263232c4805cf7a39196acf03763d9Adam Powell inflate(); 23558acbafcf2263232c4805cf7a39196acf03763d9Adam Powell } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates the layout resource identified by {@link #getLayoutResource()} 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and replaces this StubbedView in its parent by the inflated layout resource. 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The inflated layout resource. 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View inflate() { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ViewParent viewParent = getParent(); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (viewParent != null && viewParent instanceof ViewGroup) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLayoutResource != 0) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ViewGroup parent = (ViewGroup) viewParent; 252b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey final LayoutInflater factory; 253b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey if (mInflater != null) { 254b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey factory = mInflater; 255b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey } else { 256b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey factory = LayoutInflater.from(mContext); 257b27b7a152437d6ebb4f2a2700858b69634c00acdJeff Sharkey } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = factory.inflate(mLayoutResource, parent, 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInflatedId != NO_ID) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.setId(mInflatedId); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int index = parent.indexOfChild(this); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.removeViewInLayout(this); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ViewGroup.LayoutParams layoutParams = getLayoutParams(); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (layoutParams != null) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.addView(view, index, layoutParams); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.addView(view, index); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27558acbafcf2263232c4805cf7a39196acf03763d9Adam Powell mInflatedViewRef = new WeakReference<View>(view); 276b6af533114cfa5a4547990e79e96bd0402c47e72Mihai Preda 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInflateListener != null) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflateListener.onInflate(this, view); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return view; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("ViewStub must have a valid layoutResource"); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent"); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specifies the inflate listener to be notified after this ViewStub successfully 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated its layout resource. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param inflateListener The OnInflateListener to notify of successful inflation. 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.ViewStub.OnInflateListener 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnInflateListener(OnInflateListener inflateListener) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflateListener = inflateListener; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Listener used to receive a notification after a ViewStub has successfully 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated its layout resource. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.ViewStub#setOnInflateListener(android.view.ViewStub.OnInflateListener) 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface OnInflateListener { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Invoked after a ViewStub successfully inflated its layout resource. 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method is invoked after the inflated view was added to the 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchy but before the layout pass. 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param stub The ViewStub that initiated the inflation. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param inflated The inflated View. 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onInflate(ViewStub stub, View inflated); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 320