2010-10-17 12 views
17

Para indicar al usuario de mi aplicación qué campo tiene actualmente el foco, estoy intentando cambiar el color de fondo de algunos de mis campos, dependiendo del estado actual. Sin embargo, tengo problemas para entender los recursos de la lista de estados de color de androides:¿Cómo especificar el color de fondo en los recursos de la lista de estados de color?

me encontré ejemplo (lo siento, ya no funciona URL) y si lo intento exactamente la misma, es decir, si quiero adaptar el textColor, las cosas hacer trabajo. Sin embargo, si lo intento una única ligeramente diferente cosa, a saber adaptar la fondo color, cosas No trabajo y no entiendo por qué? ¿Por qué es esto tan inconsistente?

Para que sea más fácil de entender lo que estoy tratando de hacer, añado mi misc. archivos .xml:

El archivo AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="mmo.android.test" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".Test" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

El Test-Activity:

package mmo.android.test; 

import android.app.Activity; 
import android.os.Bundle; 

public class Test extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

El res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="hello">Hello World, Test!</string> 
    <string name="app_name">Test</string> 
</resources> 

res/color/button_test_color.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:color="#f0f"/> <!-- pressed --> 
    <item android:state_focused="true" android:color="#ff0"/> <!-- focused --> 
    <item android:color="#000"/> <!-- default --> 
</selector> 

y finalmente mi res/layout/main.xml archivo:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="foobar" 
     android:textColor="@color/button_test_color" 
     android:background="#f00" 
    /> 
    <!-- 
    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="foobar" 
     android:textColor="#f00" 
     android:background="@color/button_test_color" 
    /> 
    --> 
</LinearLayout> 

Si funciono esto como se muestra aquí, funciona, es decir consigo un botón cuyo color cambia según si el botón se centra texto, prensado, etc.

Si descomentar el botón inferior, donde acabo volteado los valores de los atributos de textColor y antecedentes consigo una excepción, indicando

... <item> tag requires a 'drawable' attribute or child tag defining a drawable 

¿Qué diablos me falta aquí? ¿Por qué esa lista de estado de color es aceptable como color de texto pero no como color de fondo? ¿Cómo se especifica el color de fondo de una vista dependiendo del estado de la vista?

Respuesta

0

Intenta definir textColor como estirable, en lugar de un color:

android:textColor="@drawable/button_test_color" 

categorías de recursos se basan en el tipo de recursos que son, no el nombre de la carpeta que se encuentran en los archivos XML del. formulario button_test_color.xml se menciona típicamente como "dibujable" - ¡Estoy realmente sorprendido de que el "color" haya funcionado!

+2

Forma más inf. sobre el uso de un recurso dibujable, esta [pregunta se ha hecho antes] (http://stackoverflow.com/questions/3506319/android-linearlayout-with-color-resource-what-am-i-doing-wrong). – frayser

+6

No sé por qué esta respuesta se ha marcado como correcta. El autor de la pregunta parece haber seguido los [documentos de Android] (http://developer.android.com/guide/topics/resources/color-list-resource.html) que indican que @color debe funcionar bien con un archivo xml en el directorio res/color y se hace referencia por nombre de archivo. – JulianSymes

+0

Estoy aún más sorprendido de que esta fue la respuesta elegida cuando NO FUNCIONA. -1 – Sotti

53

Tuve este problema exacto. Me parece que android:background no funciona con las listas de estado de color. Lo solucioné creando un Listable State Listable en su lugar (los colores individuales se pueden usar como dibujables en la Lista de estados).

Para utilizar su ejemplo, cree un archivo res/drawable/button_test_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:drawable="@color/pressed_color"/> 
    <item android:state_focused="true" android:drawable="@color/focused_color"/> 
    <item android:drawable="@color/default_color"/> 
</selector> 

Nota el uso de android:drawable en lugar de android:color. Android usará el recurso de color y lo convertirá en dibujable. Para terminar esto, es necesario agregar los recursos de color a su archivo res/values/colors.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    ... 
    <color name="pressed_color">#f0f</color> 
    <color name="focused_color">#ff0</color> 
    <color name="default_color">#000</color> 
    ... 
</resources> 

A continuación, se refieren a este dibujable usando @drawable/button_test_background en lugar de @color/button_test_color.

Por lo tanto, en resumen, la Lista de estado de color funciona bien para android:textColor, pero para android:background es necesario el método de lista de estado anterior.

+0

+1 - esto funciona perfectamente. :) –

+5

Esta debería ser la respuesta aceptada. – Sotti

+0

exasperante. Gracias por confirmar mi sospecha – Mark

Cuestiones relacionadas