1 package com.xtremelabs.robolectric.shadows; 2 3 import android.view.LayoutInflater; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.view.ViewParent; 7 import android.view.ViewStub; 8 import com.xtremelabs.robolectric.Robolectric; 9 import com.xtremelabs.robolectric.internal.Implementation; 10 import com.xtremelabs.robolectric.internal.Implements; 11 import com.xtremelabs.robolectric.internal.RealObject; 12 import com.xtremelabs.robolectric.res.ResourceExtractor; 13 14 import java.lang.ref.WeakReference; 15 16 @SuppressWarnings({"UnusedDeclaration"}) 17 @Implements(ViewStub.class) 18 public class ShadowViewStub extends ShadowView { 19 @RealObject ViewStub viewStub; 20 21 private int mLayoutResource = 0; 22 private int mInflatedId; 23 private WeakReference<View> mInflatedViewRef; 24 private ViewStub.OnInflateListener mInflateListener; 25 applyAttributes()26 @Override public void applyAttributes() { 27 super.applyAttributes(); 28 29 String inflatedId = attributeSet.getAttributeValue("android", "inflatedId"); 30 if (inflatedId != null) { 31 mInflatedId = getResourceId(inflatedId); 32 } 33 34 String layoutResId = attributeSet.getAttributeValue("android", "layout"); 35 if (layoutResId != null) { 36 mLayoutResource = getResourceId(layoutResId); 37 } 38 } 39 getResourceId(String inflatedId)40 private Integer getResourceId(String inflatedId) { 41 ResourceExtractor resourceExtractor = Robolectric.getShadowApplication().getResourceLoader().getResourceExtractor(); 42 return resourceExtractor.getResourceId(inflatedId, false); 43 } 44 45 @Implementation getInflatedId()46 public int getInflatedId() { 47 return mInflatedId; 48 } 49 50 @Implementation setInflatedId(int inflatedId)51 public void setInflatedId(int inflatedId) { 52 mInflatedId = inflatedId; 53 } 54 55 @Implementation getLayoutResource()56 public int getLayoutResource() { 57 return mLayoutResource; 58 } 59 60 @Implementation setLayoutResource(int layoutResource)61 public void setLayoutResource(int layoutResource) { 62 mLayoutResource = layoutResource; 63 } 64 65 @Implementation inflate()66 public View inflate() { 67 ViewParent viewParent = viewStub.getParent(); 68 69 if (viewParent != null && viewParent instanceof ViewGroup) { 70 if (mLayoutResource != 0) { 71 ViewGroup parent = (ViewGroup) viewParent; 72 LayoutInflater factory = LayoutInflater.from(viewStub.getContext()); 73 View view = factory.inflate(mLayoutResource, parent, false); 74 75 if (mInflatedId != View.NO_ID) { 76 view.setId(mInflatedId); 77 } 78 79 int index = parent.indexOfChild(viewStub); 80 parent.removeViewAt(index); 81 // parent.removeViewInLayout(viewStub); 82 83 ViewGroup.LayoutParams layoutParams = getLayoutParams(); 84 if (layoutParams != null) { 85 parent.addView(view, index, layoutParams); 86 } else { 87 parent.addView(view, index); 88 } 89 90 mInflatedViewRef = new WeakReference<View>(view); 91 92 if (mInflateListener != null) { 93 mInflateListener.onInflate(viewStub, view); 94 } 95 96 return view; 97 } else { 98 throw new IllegalArgumentException("ViewStub must have a valid layoutResource"); 99 } 100 } else { 101 throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent"); 102 } 103 } 104 } 105