package org.itsnat.droid.impl.xmlinflater.layout.classtree; import android.content.res.Configuration; import android.content.res.TypedArray; import android.view.ContextThemeWrapper; import android.view.ViewGroup; import org.itsnat.droid.impl.dom.DOMAttr; import org.itsnat.droid.impl.util.MiscUtil; import org.itsnat.droid.impl.util.NamespaceUtil; import org.itsnat.droid.impl.xmlinflater.layout.ClassDescViewMgr; import org.itsnat.droid.impl.xmlinflater.layout.attr.view.AttrDescView_view_ViewGroup_animateLayoutChanges; import org.itsnat.droid.impl.xmlinflater.layout.attr.view.AttrDescView_view_ViewGroup_descendantFocusability; import org.itsnat.droid.impl.xmlinflater.layout.attr.view.AttrDescView_view_ViewGroup_layoutAnimation; import org.itsnat.droid.impl.xmlinflater.layout.attr.view.AttrDescView_view_ViewGroup_persistentDrawingCache; import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDescReflecMethodBoolean; import java.util.List; /** * Created by jmarranz on 30/04/14. */ public class ClassDescView_view_ViewGroup extends ClassDescViewBased { private static final int[] layoutParamsAttrs = new int[]{android.R.attr.layout_width,android.R.attr.layout_height}; // android.R.attr.layout_width etc pre-existen en Android, de otra manera habría que declararlos como <declare-styleable> private static final String[] layoutParamsNames = new String[] {"layout_width","layout_height"}; private static final int[] marginLayoutParamsAttrs = new int[]{android.R.attr.layout_marginBottom,android.R.attr.layout_marginLeft,android.R.attr.layout_marginTop, android.R.attr.layout_marginRight,android.R.attr.layout_margin}; private static final String[] marginlayoutParamsNames = new String[] {"layout_marginBottom","layout_marginLeft","layout_marginTop", "layout_marginRight","layout_margin"}; public ClassDescView_view_ViewGroup(ClassDescViewMgr classMgr, ClassDescView_view_View parentClass) { super(classMgr,"android.view.ViewGroup",parentClass); } public static void getViewGroupLayoutParamsFromStyleId(int styleId, List<DOMAttr> styleLayoutParamsAttribs, ContextThemeWrapper ctx) { if (styleId == 0) throw MiscUtil.internalError(); Configuration configuration = ctx.getResources().getConfiguration(); TypedArray a = ctx.obtainStyledAttributes(styleId, layoutParamsAttrs); // Esperamos 2 resultados aunque no existan, si se utilizara a.getValue(index,outValue) el type del TypedValue outValue sería TypedValue.TYPE_NULL for(int i = 0; i < layoutParamsAttrs.length; i++) { if (!a.hasValue(i)) continue; String value = a.getString(i); String name = layoutParamsNames[i]; if (value.equals("" + ViewGroup.LayoutParams.MATCH_PARENT)) value = "match_parent"; else if (value.equals("" + ViewGroup.LayoutParams.WRAP_CONTENT)) value = "wrap_content"; // Si no es uno de los casos anteriores esperamos el valor original ej "20dp" DOMAttr attr = DOMAttr.createDOMAttr(NamespaceUtil.XMLNS_ANDROID, name, value); styleLayoutParamsAttribs.add(attr); } a.recycle(); // No hay clase base } public static void getViewGroupMarginLayoutParamsFromStyleId(int styleId,List<DOMAttr> styleLayoutParamsAttribs,ContextThemeWrapper ctx) { if (styleId == 0) throw MiscUtil.internalError(); Configuration configuration = ctx.getResources().getConfiguration(); TypedArray a = ctx.obtainStyledAttributes(styleId, marginLayoutParamsAttrs); for(int i = 0; i < marginLayoutParamsAttrs.length; i++) { if (!a.hasValue(i)) continue; // Nada especial, los atributos son dimensiones y getString devuelve el original ej 20dp String value = a.getString(i); String name = marginlayoutParamsNames[i]; DOMAttr attr = DOMAttr.createDOMAttr(NamespaceUtil.XMLNS_ANDROID, name, value); styleLayoutParamsAttribs.add(attr); } a.recycle(); // Llamamos a la clase base getViewGroupLayoutParamsFromStyleId(styleId,styleLayoutParamsAttribs,ctx); } @SuppressWarnings("unchecked") protected void init() { super.init(); addAttrDescAN(new AttrDescReflecMethodBoolean(this, "addStatesFromChildren", false)); addAttrDescAN(new AttrDescReflecMethodBoolean(this, "alwaysDrawnWithCache", "setAlwaysDrawnWithCacheEnabled", true)); addAttrDescAN(new AttrDescView_view_ViewGroup_animateLayoutChanges(this)); // animateLayoutChanges addAttrDescAN(new AttrDescReflecMethodBoolean(this, "animationCache", "setAnimationCacheEnabled", true)); addAttrDescAN(new AttrDescReflecMethodBoolean(this, "clipChildren", true)); addAttrDescAN(new AttrDescReflecMethodBoolean(this, "clipToPadding", true)); addAttrDescAN(new AttrDescView_view_ViewGroup_descendantFocusability(this)); // descendantFocusability addAttrDescAN(new AttrDescView_view_ViewGroup_layoutAnimation(this)); // layoutAnimation // android:layoutMode es Level 18 addAttrDescAN(new AttrDescView_view_ViewGroup_persistentDrawingCache(this)); // persistentDrawingCache addAttrDescAN(new AttrDescReflecMethodBoolean(this, "splitMotionEvents", "setMotionEventSplittingEnabled", false)); } }