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