Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo obtener un enum que se crea en attrs.xml en el código

He creado una vista personalizada (encontrar aquí ) con un atributo declare-styleable de tipo enum. En xml ahora puedo elegir una de las entradas de enumeración para mi atributo personalizado. Ahora quiero crear un método para establecer este valor mediante programación, pero no puedo acceder al enum.

Attr.xml

<declare-styleable name="IconView"> <attr name="icon" format="enum"> <enum name="enum_name_one" value="0"/> .... <enum name="enum_name_n" value="666"/> </attr> </declare-styleable> 

Layout.xml

 <com.xxx.views.IconView android:id="@+id/heart_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" app:icon="enum_name_x"/> 

Lo que necesito es algo como: mCustomView.setIcon(R.id.enum_name_x); Pero no puedo encontrar el enum o ni siquiera tengo idea de cómo puedo obtener el enum o los nombres del enum.

Gracias

  • ¿Cuál es la manera correcta de ampliar EditText para darle funcionalidad adicional "predeterminada"
  • Android creando cadena de animación ViewPropertyAnimator
  • Establecer el ancho y la altura de la imagen en ImageView
  • El vídeo no se reproduce correctamente en el listview de android
  • Softkey superposición con el campo EditText
  • Uso de dos diseños diferentes para elementos secundarios en ExpandableListView
  • ¿Cómo puedo forzar un sitio a escala para fijar para móviles (Iphone android ..)
  • Android spinner cerrar
  • 3 Solutions collect form web for “Cómo obtener un enum que se crea en attrs.xml en el código”

    No parece haber una forma automatizada para obtener un enum Java de un atributo enum – en Java puede obtener el valor numérico especificado – la cadena es para su uso en archivos XML (como muestra).

    Usted podría hacer esto en su opinión constructor:

     TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.IconView, 0, 0); // Gets you the 'value' number - 0 or 666 in your example if (a.hasValue(R.styleable.IconView_icon)) { int value = a.getInt(R.styleable.IconView_icon, 0)); } a.recycle(); } 

    Si desea que el valor entre en un enum, necesitará asignar el valor a un enum de Java, por ejemplo:

     private enum Format { enum_name_one(0), enum_name_n(666); int id; Format(int id) { this.id = id; } static Format fromId(int id) { for (Format f : values()) { if (f.id == id) return f; } throw new IllegalArgumentException(); } } 

    A continuación, en el primer bloque de código que podría utilizar:

     Format format = Format.fromId(a.getInt(R.styleable.IconView_icon, 0))); 

    (Aunque lanzar una excepción en este punto puede no ser una gran idea, probablemente mejor elegir un valor por defecto sensible)

    Bueno por el bien de la cordura. Asegúrese de que sus ordinales son iguales en su estilo declarado como en su declaración de Enum y acceda a él como una matriz.

     TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.IconView, 0, 0); int ordinal = a.getInt(R.styleable.IconView_icon, 0); if (ordinal >= 0 && ordinal < MyEnum.values().length) { enumValue = MyEnum.values()[ordinal]; } 

    Sé que ha pasado un tiempo desde que se publicó la pregunta, pero tuve el mismo problema recientemente. He hackeado un poco algo que utiliza JavaPoet de Square y algunas cosas en el build.gradle que crea automáticamente una clase Java enum desde el attrs.xml en la construcción del proyecto.

    Hay una pequeña demostración y un readme con una explicación en https://github.com/afterecho/create_enum_from_xml

    Espero eso ayude.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.