14bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes/* 24bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Copyright (C) 2014 The Android Open Source Project 34bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 44bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 54bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * you may not use this file except in compliance with the License. 64bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * You may obtain a copy of the License at 74bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 84bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * http://www.apache.org/licenses/LICENSE-2.0 94bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 104bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Unless required by applicable law or agreed to in writing, software 114bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * distributed under the License is distributed on an "AS IS" BASIS, 124bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * See the License for the specific language governing permissions and 144bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * limitations under the License. 154bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 164bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1766698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banespackage android.support.v7.widget; 184bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikasimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP; 208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas 214bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.content.Context; 224bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.content.res.TypedArray; 234bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.graphics.Canvas; 24c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo; 254bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.support.v7.appcompat.R; 264bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.util.AttributeSet; 274bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.view.LayoutInflater; 284bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.view.View; 294bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.view.ViewGroup; 304bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport android.view.ViewParent; 314bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 324bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banesimport java.lang.ref.WeakReference; 334bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 344bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes/** 354bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Backport of {@link android.view.ViewStub} so that we can set the 364bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * {@link android.view.LayoutInflater} on devices before Jelly Bean. 374bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 384bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @hide 394bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 408e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas@RestrictTo(LIBRARY_GROUP) 414bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banespublic final class ViewStubCompat extends View { 424bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes private int mLayoutResource = 0; 434bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes private int mInflatedId; 444bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 454bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes private WeakReference<View> mInflatedViewRef; 464bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 474bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes private LayoutInflater mInflater; 484bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes private OnInflateListener mInflateListener; 494bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 504bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public ViewStubCompat(Context context, AttributeSet attrs) { 514bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes this(context, attrs, 0); 524bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 534bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 544bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public ViewStubCompat(Context context, AttributeSet attrs, int defStyle) { 554bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes super(context, attrs, defStyle); 564bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 574bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ViewStubCompat, 584bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes defStyle, 0); 594bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 604bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes mInflatedId = a.getResourceId(R.styleable.ViewStubCompat_android_inflatedId, NO_ID); 614bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes mLayoutResource = a.getResourceId(R.styleable.ViewStubCompat_android_layout, 0); 624bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 634bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes setId(a.getResourceId(R.styleable.ViewStubCompat_android_id, NO_ID)); 644bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes a.recycle(); 654bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 664bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes setVisibility(GONE); 674bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes setWillNotDraw(true); 684bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 694bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 704bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 714bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Returns the id taken by the inflated view. If the inflated id is 724bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * {@link View#NO_ID}, the inflated view keeps its original id. 734bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 744bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @return A positive integer used to identify the inflated view or 754bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * {@link #NO_ID} if the inflated view should keep its id. 764bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 774bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see #setInflatedId(int) 78929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:inflatedId 794bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 804bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public int getInflatedId() { 814bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes return mInflatedId; 824bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 834bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 844bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 854bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Defines the id taken by the inflated view. If the inflated id is 864bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * {@link View#NO_ID}, the inflated view keeps its original id. 874bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 884bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @param inflatedId A positive integer used to identify the inflated view or 894bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * {@link #NO_ID} if the inflated view should keep its id. 904bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 914bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see #getInflatedId() 92929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:inflatedId 934bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 944bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public void setInflatedId(int inflatedId) { 954bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes mInflatedId = inflatedId; 964bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 974bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 984bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 994bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Returns the layout resource that will be used by {@link #setVisibility(int)} or 1004bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * {@link #inflate()} to replace this StubbedView 1014bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * in its parent by another view. 1024bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 1034bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @return The layout resource identifier used to inflate the new View. 1044bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 1054bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see #setLayoutResource(int) 1064bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see #setVisibility(int) 1074bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see #inflate() 108929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:layout 1094bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 1104bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public int getLayoutResource() { 1114bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes return mLayoutResource; 1124bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1134bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1144bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 1154bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Specifies the layout resource to inflate when this StubbedView becomes visible or invisible 1164bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * or when {@link #inflate()} is invoked. The View created by inflating the layout resource is 1174bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * used to replace this StubbedView in its parent. 1184bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 1194bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @param layoutResource A valid layout resource identifier (different from 0.) 1204bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 1214bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see #getLayoutResource() 1224bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see #setVisibility(int) 1234bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see #inflate() 124929f27aab7ac7231f3734c988d5ee7201627d535Alan Viverette * @attr name android:layout 1254bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 1264bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public void setLayoutResource(int layoutResource) { 1274bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes mLayoutResource = layoutResource; 1284bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1294bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1304bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 1314bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Set {@link LayoutInflater} to use in {@link #inflate()}, or {@code null} 1324bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * to use the default. 1334bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 1344bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public void setLayoutInflater(LayoutInflater inflater) { 1354bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes mInflater = inflater; 1364bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1374bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1384bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 1394bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Get current {@link LayoutInflater} used in {@link #inflate()}. 1404bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 1414bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public LayoutInflater getLayoutInflater() { 1424bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes return mInflater; 1434bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1444bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1454bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes @Override 1464bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 1474bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes setMeasuredDimension(0, 0); 1484bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1494bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1504bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes @Override 1514bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public void draw(Canvas canvas) { 1524bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1534bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1544bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes @Override 1554bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes protected void dispatchDraw(Canvas canvas) { 1564bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1574bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1584bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 1594bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * When visibility is set to {@link #VISIBLE} or {@link #INVISIBLE}, 1604bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * {@link #inflate()} is invoked and this StubbedView is replaced in its parent 1614bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * by the inflated layout resource. After that calls to this function are passed 1624bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * through to the inflated view. 1634bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 1644bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}. 1654bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 1664bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see #inflate() 1674bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 1684bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes @Override 1694bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public void setVisibility(int visibility) { 1704bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes if (mInflatedViewRef != null) { 1714bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes View view = mInflatedViewRef.get(); 1724bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes if (view != null) { 1734bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes view.setVisibility(visibility); 1744bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } else { 1754bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes throw new IllegalStateException("setVisibility called on un-referenced view"); 1764bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1774bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } else { 1784bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes super.setVisibility(visibility); 1794bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes if (visibility == VISIBLE || visibility == INVISIBLE) { 1804bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes inflate(); 1814bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1824bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1834bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 1844bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1854bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 1864bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Inflates the layout resource identified by {@link #getLayoutResource()} 1874bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * and replaces this StubbedView in its parent by the inflated layout resource. 1884bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 1894bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @return The inflated layout resource. 1904bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 1914bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 1924bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public View inflate() { 1934bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes final ViewParent viewParent = getParent(); 1944bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 1954bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes if (viewParent != null && viewParent instanceof ViewGroup) { 1964bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes if (mLayoutResource != 0) { 1974bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes final ViewGroup parent = (ViewGroup) viewParent; 1984bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes final LayoutInflater factory; 1994bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes if (mInflater != null) { 2004bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes factory = mInflater; 2014bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } else { 2024bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes factory = LayoutInflater.from(getContext()); 2034bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 2044bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes final View view = factory.inflate(mLayoutResource, parent, 2054bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes false); 2064bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 2074bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes if (mInflatedId != NO_ID) { 2084bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes view.setId(mInflatedId); 2094bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 2104bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 2114bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes final int index = parent.indexOfChild(this); 2124bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes parent.removeViewInLayout(this); 2134bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 2144bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes final ViewGroup.LayoutParams layoutParams = getLayoutParams(); 2154bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes if (layoutParams != null) { 2164bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes parent.addView(view, index, layoutParams); 2174bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } else { 2184bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes parent.addView(view, index); 2194bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 2204bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 2214bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes mInflatedViewRef = new WeakReference<View>(view); 2224bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 2234bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes if (mInflateListener != null) { 2244bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes mInflateListener.onInflate(this, view); 2254bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 2264bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 2274bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes return view; 2284bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } else { 2294bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes throw new IllegalArgumentException("ViewStub must have a valid layoutResource"); 2304bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 2314bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } else { 2324bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent"); 2334bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 2344bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 2354bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 2364bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 2374bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Specifies the inflate listener to be notified after this ViewStub successfully 2384bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * inflated its layout resource. 2394bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 2404bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @param inflateListener The OnInflateListener to notify of successful inflation. 2414bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 2424bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see android.view.ViewStub.OnInflateListener 2434bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 2444bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public void setOnInflateListener(OnInflateListener inflateListener) { 2454bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes mInflateListener = inflateListener; 2464bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 2474bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes 2484bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 2494bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Listener used to receive a notification after a ViewStub has successfully 2504bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * inflated its layout resource. 2514bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 2524bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @see android.view.ViewStub#setOnInflateListener(android.view.ViewStub.OnInflateListener) 2534bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 2544bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes public static interface OnInflateListener { 2554bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes /** 2564bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * Invoked after a ViewStub successfully inflated its layout resource. 2574bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * This method is invoked after the inflated view was added to the 2584bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * hierarchy but before the layout pass. 2594bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * 2604bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @param stub The ViewStub that initiated the inflation. 2614bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes * @param inflated The inflated View. 2624bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes */ 2634bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes void onInflate(ViewStubCompat stub, View inflated); 2644bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes } 2654bd5cbd6ca4f1e5ed43217b808068a48f937feabChris Banes}