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

  • Inicio de la videollamada
  • ¿Cuál es la diferencia entre BaseAdapter y ArrayAdapter?
  • Cómo extraer el texto del elemento seleccionado en el listView
  • Custom attr get devuelve valores inválidos
  • Teclado con scrollView
  • ¿Cómo abrir o simular un clic en una preferencia de Android, creado con XML, mediante programación?
  • <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

  • Error al inflar la clase CollapsingToolbarLayout
  • ¿Para fragmentar o no fragmentar?
  • Descrip "top" en Android
  • Deshabilitar el botón Inicio en la aplicación de pantalla de inicio?
  • Explicar la diferencia entre el dibujable, drawable-ldpi, drawable-mdpi y drawable-hdpi
  • Excepción de URL malformada de Java
  • 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.