2010-10-17 12 views
17

Um dem Benutzer meiner App einen Hinweis darauf zu geben, welches Feld momentan den Fokus hat, versuche ich die Hintergrundfarbe einiger meiner Felder abhängig vom aktuellen Status zu ändern. Ich habe jedoch Probleme, Androids Color State List Resources zu verstehen:Wie kann ich Hintergrundfarbe in Ressourcen für Farbstatuslisten angeben?

ich fand Beispiel (sorry, URL nicht mehr funktioniert) und wenn ich genau gleich, dh versuchen, wenn ich die Textfarbe anpassen will, Dinge Arbeit tun. Allerdings, wenn ich versuche, nur etwas anders Sache, nämlich die Hintergrundfarbe Farbe anzupassen, Dinge nicht arbeiten und ich verstehe nicht warum? Warum ist das so inkonsequent?

Um es einfacher zu verstehen, was ich versuche zu tun, füge ich meine Misc an. .xml-Dateien:

Die AndroidManifest.xml Datei:

<?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> 

Die 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); 
    } 
} 

Die 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> 

und schließlich meine res/layout/main.xml Datei:

<?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> 

Wenn ich dies ausführen, wie hier gezeigt, es funktioniert, also erhalte ich eine Schaltfläche, deren Textfarbe ändert, je nachdem, ob die Taste fokussiert ist, gedrückt wird, usw.

Wenn ich die untere Taste Kommentar-, wo ich blätterte nur die Attributwerte für Textfarbe und Hintergrund ich eine Ausnahme erhalten, die besagt,

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

Was zum Teufel vermisse ich hier? Warum ist diese Farbzustandsliste als Textfarbe akzeptabel, aber nicht als Hintergrundfarbe? Wie spezifiziert man die Hintergrundfarbe einer Ansicht abhängig vom Zustand der Ansicht?

Antwort

0

Versuchen Sie Textfarbe als ziehbar definieren, sondern als eine Farbe:

android:textColor="@drawable/button_test_color" 

Ressourcenkategorien basieren auf welche Art von Ressourcen, die sie sind, nicht den Namen des Ordners sie sich befinden XML-Dateien der. form button_test_color.xml werden typischerweise als "drawable" referenziert - ich bin eigentlich überrascht, dass "color" überhaupt funktioniert!

+2

Form mehr inf. bei der Verwendung einer aufzeichnbaren Ressource wurde diese [Frage zuvor gestellt] (http://stackoverflow.com/questions/3506319/android-linearlayout-with-color-resource-what-am-i-doing-wrong). – frayser

+6

Ich weiß nicht, warum diese Antwort als richtig markiert wurde. Der Fragesteller scheint den [Android-Dokumenten] (http://developer.android.com/guide/topics/resources/color-list-resource.html) gefolgt zu sein, die anzeigen, dass @color mit einer XML-Datei in der res/color-Verzeichnis und wird mit Dateiname bezeichnet. – JulianSymes

+0

Ich bin noch mehr überrascht, dass dies die gewählte Antwort war, wenn IT überhaupt nicht funktioniert. -1 – Sotti

53

Ich hatte genau dieses Problem. Es sieht für mich aus wie android:background funktioniert nicht mit Farbstatuslisten. Ich habe das Problem gelöst, indem ich stattdessen eine State List Drawable erstellt habe (einzelne Farben können als Zeichen in der Zustandsliste verwendet werden).

Ihr Beispiel verwenden, erstellen Sie eine Datei 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> 

Beachten Sie die Verwendung von android:drawable statt android:color. Android verwendet die Farbressource und macht daraus ein Zeichen. Zum Abschluss dieses weg, müssen Sie die Farbe zu Ihrer res/values/colors.xml Datei hinzuzufügen:

<?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> 

Sie würden dann auf diese ziehbar verweisen mit @drawable/button_test_background statt @color/button_test_color.

Zusammenfassend funktioniert die Farbstatusliste für android:textColor, aber für android:background die State List Drawable-Methode oben ist erforderlich.

+0

+1 - das funktioniert perfekt. :) –

+5

Dies sollte die akzeptierte Antwort sein. – Sotti

+0

Wütend. Danke, dass du meinen Verdacht bestätigt hast – Mark

Verwandte Themen