Atributos personalizados en estilos.XML


He creado un widget personalizado, y lo estoy declarando en layout.XML. También he añadido algunos atributos personalizados en attr.XML. Sin embargo, al intentar declarar estos atributos en un estilo en estilos.xml, me está dando No resource found that matches the given name: attr 'custom:attribute'.

He puesto el xmlns:custom="http://schemas.android.com/apk/res/com.my.package" en todas las etiquetas de estilos.xml, incluyendo <?xml>, <resources>, y <style>, pero todavía me da el mismo error, que no puede encontrar mi espacio de nombres XML personalizado.

Sin embargo, puedo usar mi espacio de nombres para asignar manualmente atributos a la vista en mi diseño.xml, por lo que no hay nada malo con el espacio de nombres. Mi problema radica en hacer estilos.xml consciente de mi attr.XML.

Author: Vertexwahn, 2011-07-28

5 answers

¡Lo descubrí! La respuesta es NO especificar el espacio de nombres en el estilo.

<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="CustomStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>

        <item name="custom_attr">value</item> <!-- tee hee -->
    </style>
</resources>
 332
Author: styler1972,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-26 15:35:41

La respuesta anterior funciona para mí, probé un cambio pequeño, declaro styleable para una clase en el elemento resources.

<declare-styleable name="VerticalView">
    <attr name="textSize" format="dimension" />
    <attr name="textColor" format="color" />
    <attr name="textBold" format="boolean" />
</declare-styleable>

En declare-styleable, el atributo name hace referencia a un nombre de clase, por lo que tuve una llamada a la clase view "com.my.package.name.VerticalView", que representaba esta declaración debe usarse en VerticalView o subclases de VerticalView. así que podemos declarar estilo como este:

<resources>
    <style name="verticalViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">36dip</item>

        <item name="textSize">28sp</item>  <!-- not namespace prefix -->
        <item name="textColor">#ff666666</item>
        <item name="textBold">true</item>
    </style>
</resources>

Es por eso que no declaramos el espacio de nombres en el elemento resources, todavía trabajo.

 37
Author: VinceStyling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 07:23:04

La modificación de Styler y Vince funcionó para mí. Quería señalar que la explicación de @vince puede no ser del todo precisa.

Para probar la hipótesis de que el atributo name de la declare-styleable que coincide con el nombre de la clase custom view nos permite acceder al atributo custom sin un espacio de nombres, cambié el nombre de la declare-styleable (la vista custom se llamó TestViewFont:

<declare-styleable name="TextViewFont2">
    <attr name="font" format="integer"/>
</declare-styleable>

Luego cambié la llamada obtainStyledAttributes en la vista personalizada para reflejar esto:

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);

El código todavía ejecutar. Así que no creo que sea algún tipo de introspección por el declare-styleable de la clase que le da nombre.

Por lo tanto, me llevan a creer que cualquier atributo personalizado se puede usar para declarar un estilo sin hacer referencia a un espacio de nombres.

En cualquier caso, gracias por toda la ayuda chicos, se resolvió mi problema.

 8
Author: Abid H. Mujtaba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-30 16:15:00

En caso de que ayude a alguien más, mi error fue que mi clase de vista personalizada estaba llamando a AttributeSet.getAttributeValue e. g.

String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");

...lo que resultó en que mi atributo personalizado no se leyera para mi vista personalizada.

La solución fue usar obtainStyledAttributes en mi vista personalizada:

 TypedArray styleAttrs = context.obtainStyledAttributes(attrs, R.styleable.MyTextViewStyleable);
 String fontName = styleAttrs.getString(R.styleable.MyTextViewStyleable_customFont);

Una pista de que esto está funcionando correctamente es que puede Ctrl/Apple + haga clic en el R.styleable.MyTextViewStyleable_customFont para ser llevado directamente a su attrs.definición xml.

Me llevó un tiempo detectar esto diferencia crítica entre mi código y los otros ejemplos, ya que el atributo personalizado funcionó bien cuando se pasó directamente a través del XML de diseño (en lugar de a través de un estilo).

 1
Author: Dan J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-13 02:52:09

Valores / estilos.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="defaultButtonColor">@color/red</item>
    <item name="defaultButtonHeight">@dimen/dp_100</item>
</style>

Valores / attrs.xml

<resources>
    <attr name="defaultButtonColor" format="reference" />
    <attr name="defaultButtonHeight" format="reference"/>
</resources>

Valores/colores.xml

<resources>
    <color name="red">#f00</color>
</resources>

Valores / dimensiones.xml

<resources>
    <dimen name="dp_100">100dp</dimen>
</resources>

Usando

<Button
    android:layout_width="wrap_content"
    android:layout_height="?attr/defaultButtonHeight"
    android:text="Button"
    android:textColor="?attr/defaultButtonColor"
    />

introduzca la descripción de la imagen aquí

DEMO

 1
Author: Phan Van Linh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-15 04:06:06