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

  • Hacer que el inicio de sesión en facebook funcione con una vista Web de Android
  • Color androide del efecto del borde del scrollview del lollipop
  • PopupWindow sobre el teclado virtual
  • Android ExoPlayer: ¿Resuelve el problema de reproducción sin interrupciones / sin fisuras que está roto para el reproductor de medios Android
  • Cómo supervisar las solicitudes HTTP (get, post etc) que está haciendo mi aplicación en android
  • Android genymotion vs emulador
  • <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

  • Android en la aplicación de compra V3 Error: la autenticación es necesaria
  • ¿Cómo puedo incluir programaticamente en Android?
  • ¿Cómo administrar un DialogFragment con RxJava?
  • Android: Centrar una imagen
  • Administrar la clave de la API de Google Maps con Gradle en Android Studio
  • Videoview de pantalla completa sin alargar el video
  • 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.