/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.databinding; import android.view.View; import android.view.ViewStub; import android.view.ViewStub.OnInflateListener; /** * This class represents a ViewStub before and after inflation. Before inflation, * the ViewStub is accessible. After inflation, the root View of the inflated layout * will be available. If the inflated layout has data binding, the ViewDataBinding for the inflated * View is accessible. */ public class ViewStubProxy { private ViewStub mViewStub; private ViewDataBinding mViewDataBinding; private View mRoot; private OnInflateListener mOnInflateListener; private ViewDataBinding mContainingBinding; private OnInflateListener mProxyListener = new OnInflateListener() { @Override public void onInflate(ViewStub stub, View inflated) { mRoot = inflated; mViewDataBinding = DataBindingUtil.bind(mContainingBinding.mBindingComponent, inflated, stub.getLayoutResource()); mViewStub = null; if (mOnInflateListener != null) { mOnInflateListener.onInflate(stub, inflated); mOnInflateListener = null; } mContainingBinding.invalidateAll(); mContainingBinding.forceExecuteBindings(); } }; public ViewStubProxy(ViewStub viewStub) { mViewStub = viewStub; mViewStub.setOnInflateListener(mProxyListener); } public void setContainingBinding(ViewDataBinding containingBinding) { mContainingBinding = containingBinding; } /** * Returns <code>true</code> if the ViewStub has replaced itself with the inflated layout * or <code>false</code> if not. * * @return <code>true</code> if the ViewStub has replaced itself with the inflated layout * or <code>false</code> if not */ public boolean isInflated() { return mRoot != null; } /** * Returns the root View of the layout replacing the ViewStub once it has been inflated. * <code>null</code> is returned prior to inflation. * * @return the root View of the layout replacing the ViewStub once it has been inflated. * <code>null</code> is returned prior to inflation */ public View getRoot() { return mRoot; } /** * Returns the data binding associated with the inflated layout once it has been inflated. * <code>null</code> prior to inflation or if there is no binding associated with the layout. * * @return the data binding associated with the inflated layout once it has been inflated. * <code>null</code> prior to inflation or if there is no binding associated with the layout */ public ViewDataBinding getBinding() { return mViewDataBinding; } /** * Returns the ViewStub in the layout or <code>null</code> if the ViewStub has been inflated. * * @return the ViewStub in the layout or <code>null</code> if the ViewStub has been inflated. */ public ViewStub getViewStub() { return mViewStub; } /** * Sets the {@link OnInflateListener} to be called when the ViewStub inflates. The proxy must * have an OnInflateListener, so <code>listener</code> will be called immediately after * the proxy's listener is called. * * @param listener The OnInflateListener to notify of successful inflation */ public void setOnInflateListener(OnInflateListener listener) { if (mViewStub != null) { mOnInflateListener = listener; } } }