package org.itsnat.droid.impl.xmlinflater.layout; import android.view.View; import android.view.ViewParent; import org.itsnat.droid.impl.util.WeakMapWithValue; import org.itsnat.droid.impl.xmlinflated.layout.InflatedXMLLayoutImpl; /** * Created by jmarranz on 25/08/14. */ public class ViewMapByXMLId { protected InflatedXMLLayoutImpl layout; protected WeakMapWithValue<String,View> mapIdViewXMLStd; public ViewMapByXMLId(InflatedXMLLayoutImpl layout) { this.layout = layout; } public WeakMapWithValue<String,View> getMapIdViewXMLStdPureField() { return mapIdViewXMLStd; // Puede ser nulo } public WeakMapWithValue<String,View> getMapIdViewXMLStd() { if (mapIdViewXMLStd == null) mapIdViewXMLStd = new WeakMapWithValue<String,View>(); return mapIdViewXMLStd; } public String getXMLId(View view) { // Quiero el id de este View, no es relevante si está dentro del árbol de Views o no ViewId viewId = ViewId.getViewId(layout, view); return viewId.getXMLId(); // Puede ser null el resultado obviamente //return getMapIdViewXMLStd().getKeyByValue(view); } public void setXMLId(String id, View view) { ViewId viewId = ViewId.getViewId(layout, view); viewId.setXMLId(id); getMapIdViewXMLStd().put(id,view); } public String unsetXMLId(View view) { ViewId viewId = ViewId.getViewId(layout, view); viewId.unsetXMLId(); viewId.disconnect(); // Así liberamos memoria y el objeto ViewId se pierde return getMapIdViewXMLStd().removeByValue(view); } public View findViewByXMLId(String id) { // Busca sólo DENTRO del árbol de Views, si está desconectado devolverá null if (mapIdViewXMLStd == null) return null; View viewFound = getMapIdViewXMLStd().getValueByKey(id); if (viewFound == null) return null; // Ojo, puede estar desconectado aunque el objeto Java esté "vivo" View rootView = layout.getRootView(); if (viewFound == rootView) return viewFound; // No está desconectado ViewParent parent = viewFound.getParent(); while(parent != null) { if (parent == rootView) { return viewFound; } parent = parent.getParent(); } // Está registrado pero sin embargo no está en el árbol de Views, podríamos eliminarlo (remove) para que no de la lata // pero si se vuelve a insertar perderíamos el elemento pues al reinsertar no podemos capturar la operación y definir el id, // tampoco es que sea demasiado importante porque el programador una vez que cambia el árbol de views por su cuenta // "rompe" los "contratos" de ItsNatDroid return null; } }