All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.xtremelabs.robolectric.shadows.ShadowViewStub Maven / Gradle / Ivy

There is a newer version: 1.2
Show newest version
package com.xtremelabs.robolectric.shadows;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewStub;
import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.internal.RealObject;
import com.xtremelabs.robolectric.res.ResourceExtractor;

import java.lang.ref.WeakReference;

@SuppressWarnings({"UnusedDeclaration"})
@Implements(ViewStub.class)
public class ShadowViewStub extends ShadowView {
    @RealObject ViewStub viewStub;

    private int mLayoutResource = 0;
    private int mInflatedId;
    private WeakReference mInflatedViewRef;
    private ViewStub.OnInflateListener mInflateListener;

    @Override public void applyAttributes() {
        super.applyAttributes();

        String inflatedId = attributeSet.getAttributeValue("android", "inflatedId");
        if (inflatedId != null) {
            mInflatedId = getResourceId(inflatedId);
        }

        String layoutResId = attributeSet.getAttributeValue("android", "layout");
        if (layoutResId != null) {
            mLayoutResource = getResourceId(layoutResId);
        }
    }

    private Integer getResourceId(String inflatedId) {
        ResourceExtractor resourceExtractor = Robolectric.getShadowApplication().getResourceLoader().getResourceExtractor();
        return resourceExtractor.getResourceId(inflatedId, false);
    }

    @Implementation
    public int getInflatedId() {
        return mInflatedId;
    }

    @Implementation
    public void setInflatedId(int inflatedId) {
        mInflatedId = inflatedId;
    }

    @Implementation
    public int getLayoutResource() {
        return mLayoutResource;
    }

    @Implementation
    public void setLayoutResource(int layoutResource) {
        mLayoutResource = layoutResource;
    }

    @Implementation
    public View inflate() {
        ViewParent viewParent = viewStub.getParent();

        if (viewParent != null && viewParent instanceof ViewGroup) {
            if (mLayoutResource != 0) {
                ViewGroup parent = (ViewGroup) viewParent;
                LayoutInflater factory = LayoutInflater.from(viewStub.getContext());
                View view = factory.inflate(mLayoutResource, parent, false);

                if (mInflatedId != View.NO_ID) {
                    view.setId(mInflatedId);
                }

                int index = parent.indexOfChild(viewStub);
                parent.removeViewAt(index);
//        parent.removeViewInLayout(viewStub);

                ViewGroup.LayoutParams layoutParams = getLayoutParams();
                if (layoutParams != null) {
                    parent.addView(view, index, layoutParams);
                } else {
                    parent.addView(view, index);
                }

                mInflatedViewRef = new WeakReference(view);

                if (mInflateListener != null) {
                    mInflateListener.onInflate(viewStub, view);
                }

                return view;
            } else {
                throw new IllegalArgumentException("ViewStub must have a valid layoutResource");
            }
        } else {
            throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy