theme temas style studio personalizar personalizadas para hoja estilos edittext crear and activities android custom-attributes android-xml android-custom-view

temas - Uso de una referencia de matriz como atributo XML para la vista personalizada de Android



hoja de estilos android (3)

Este problema ha sido resuelto, ver comentarios para más detalles.

Estoy extendiendo una vista de Android existente y cargando algunos atributos personalizados, como se describe en Declarar un elemento de la interfaz de usuario de Android personalizado mediante XML y Definir atributos personalizados .

Los atributos con formatos booleanos y enteros funcionan bien, pero cuando trato de especificar una referencia a un recurso de matriz, la aplicación falla al iniciarse. He definido una matriz de enteros dentro de un archivo de recursos xml y estoy tratando de usarlo como un atributo para la vista personalizada.

Puedo usar el recurso de matriz para configurar el atributo "entradas" de la clase Spinner de Android sin errores, por lo que parece ser un problema en mi implementación. Los mensajes de logcat no parecen proporcionar ninguna información específica sobre el bloqueo, pero sigo buscando, así que actualizaré si encuentro algo.

Los atributos son declarados por (en attrs.xml):

<declare-styleable name="CustomView"> <attr name="values" format="reference"/> <attr name="isActive" format="boolean"/> </declare-styleable>

La matriz se define como (en arrays.xml):

<integer-array name="nums"> <item>1</item> <item>2</item> <item>3</item> </integer-array>

Y estoy haciendo referencia a la matriz por:

<com.test.CustomView cv:values="@array/nums" />

Y esto hace que la aplicación se bloquee inmediatamente. Además, si hago referencia a un recurso de color en lugar de una matriz, la aplicación no se bloquea. ¿Alguien sabe cómo lidiar con este problema?


La otra respuesta funciona bien con una serie de cadenas . Sin embargo, arr.getTextArray(...) en una matriz de referencias , por ejemplo

<array name="tmp"> <item>@drawable/a</item> <item>@drawable/b</item> </array>

le dará res/drawable/a.png como CharSequence en lugar de la identificación del recurso.

La forma correcta de analizar una serie de referencias es esta:

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView); int arrayResourceId = typedArray.getResourceId(R.styleable.CustomView_CustomAttr, 0); if (arrayResourceId != 0) { final TypedArray resourceArray = getResources().obtainTypedArray(arrayResourceId); for (int i = 0; i < resourceArray.length(); i++) { final int resourceId = resourceArray.getResourceId(i, 0); // do stuff with resourceId, such as getResources().getDrawable(resourceId) } resourceArray.recycle(); } typedArray.recycle();


La pregunta es acerca de cómo obtener una matriz de enteros, para mi caso, necesito leer los colores (int) de una matriz para mi vista personalizada, definición que se puede marcar como se muestra a continuación:

<declare-styleable name="ColorPickerView"> <attr name="colors" format="reference" /> </declare-styleable>

Luego uso mi vista personalizada como a continuación:

<com.rainliu.colorpicker.ColorPickerView android:id="@+id/rtePalette" android:layout_width="wrap_content" android:layout_height="wrap_content" colorPickerView:colors="@array/colorPickerColors" />

La definición de los colores es la siguiente:

<resources> <color name="colorPrimary">#FF9800</color> <array name="colorPickerColors"> <item>#000000</item> <item>#E65100</item> <item>@color/colorPrimary</item> </array> </resources>

Así que necesito obtener los colores en mi vista personalizada (ColorPickerView), código como se muestra a continuación:

TypedArray ta = context.obtainStyledAttributes(attributeSet, R.styleable.ColorPickerView); int colorsId = ta.getResourceId(R.styleable.ColorPickerView_colors, 0); int[] colorsArray = ta.getResources().getIntArray(colorsId); for (int a : colorsArray) { Log.e("AA", "color == " + a); } ta.recycle();

Aquí está la impresión de colorsArray:

03-11 14:25:53.894 15300-15300/com.chinalwb.are E/AA: color == -16777216 03-11 14:25:53.894 15300-15300/com.chinalwb.are E/AA: color == -1683200 03-11 14:25:53.894 15300-15300/com.chinalwb.are E/AA: color == -1683200

Espero que esto ayude a algunos chicos.


Simplemente, vaya a cuestas su pregunta aquí, ya que su publicación aparece primero si busca en Google algo como "vista personalizada del atributo XML de referencia de matriz", por lo que alguien podría encontrar esto útil.

Si desea que su vista personalizada haga referencia a un conjunto de cadenas , puede usar el atributo existente de android:entries XML de android:entries , en lugar de crear un atributo personalizado totalmente nuevo.

Simplemente haga lo siguiente en res/values/attrs.xml :

<resources> <declare-styleable name="MyCustomView"> <attr name="android:entries" /> </declare-styleable> </resources>

Entonces haz esto en el constructor de tu vista personalizada:

public MyCustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyle, 0); try { CharSequence[] entries = a.getTextArray(R.styleable.MyCustomView_android_entries); if (entries != null) { //do something with the array if you want } } finally { a.recycle(); } }

Y luego debería poder hacer referencia a una matriz de cadenas a través del atributo android:entries cuando agrega su Vista personalizada a un archivo de diseño XML. Ejemplo:

<com.example.myapp.MyCustomView android:layout_width="wrap_content" android:layout_height="wrap_content" android:entries="@array/my_array_of_strings" />

Esto es exactamente cómo se hace en la clase ListView (mire en la fuente, verá).