package org.itsnat.droid.impl.xmlinflater.layout.attr; import android.view.View; import android.view.ViewGroup; import org.itsnat.droid.ItsNatDroidException; import org.itsnat.droid.impl.dom.DOMAttr; import org.itsnat.droid.impl.util.MiscUtil; import org.itsnat.droid.impl.xmlinflated.layout._IncludeFakeViewGroup_; import org.itsnat.droid.impl.xmlinflater.layout.AttrLayoutContext; import org.itsnat.droid.impl.xmlinflater.layout.PendingViewPostCreateProcess; import org.itsnat.droid.impl.xmlinflater.layout.XMLInflaterLayout; import org.itsnat.droid.impl.xmlinflater.layout.classtree.ClassDescViewBased; import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDesc; import java.util.ArrayList; /** * Created by jmarranz on 30/04/14. */ public class AttrDesc_Include_layout extends AttrDesc<ClassDescViewBased,View,AttrLayoutContext> { public AttrDesc_Include_layout(ClassDescViewBased parent) { super(parent,"layout"); } @Override public void setAttribute(final View view,final DOMAttr attr,final AttrLayoutContext attrCtx) { Runnable task = new Runnable() { @Override public void run() { _IncludeFakeViewGroup_ viewIncludeFake = (_IncludeFakeViewGroup_)view; ViewGroup viewParent = (ViewGroup)view.getParent(); int indexOfInclude = viewParent.indexOfChild(viewIncludeFake); viewParent.removeViewAt(indexOfInclude); // Eliminamos el falso View auxiliar que substituye al <include> y que está recien insertado if (viewIncludeFake.getParent() != null) throw MiscUtil.internalError(); XMLInflaterLayout xmlInflater = attrCtx.getXMLInflaterLayout(); ArrayList<DOMAttr> includeAttribs = ((_IncludeFakeViewGroup_)view).getAttribs(); //int countBefore = viewParent.getChildCount(); View resView = getLayout(attr.getResourceDesc(),attrCtx.getXMLInflaterContext(), xmlInflater, viewParent, indexOfInclude, includeAttribs); if (resView != viewParent) throw new ItsNatDroidException("Internal Error"); // Es así, ten en cuenta que el layout incluido puede ser un <merge> con varios views, si viewParent es no nulo se devuelve viewParent, idem que en el inflado nativo // Test para ver que se ha insertado si fue al final (eliminar en el futuro): /* int countAfter = viewParent.getChildCount(); View[] childList = new View[countAfter - countBefore]; int j = 0; for(int i = countBefore; i < countAfter; i++) { childList[j] = viewParent.getChildAt(i); j++; } */ } }; PendingViewPostCreateProcess pendingViewPostCreateProcess = attrCtx.getPendingViewPostCreateProcess(); if (pendingViewPostCreateProcess != null) pendingViewPostCreateProcess.addPendingPostAddViewTask(task); else task.run(); } @Override public void removeAttribute(View view, AttrLayoutContext attrCtx) { setAttributeToRemove(view, "@null", attrCtx); } }