2010-09-17 12 views
34

Ich möchte die Hintergrundfarbe einer Schaltfläche mit einer Selektor-XML-Datei ändern. Mein Ansatz ist im Grunde die man aus dem Beispiel am unteren Rand dieser Seite: http://developer.android.com/guide/topics/resources/color-list-resource.htmlAndroid-Taste mit verschiedenen Hintergrundfarben

ich habe eine res/Farbe/button_text.xml, die wie folgt aussieht:

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

und mein Layout enthält den folgenden Code:

<Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/button_text" 
    **android:background="@color/button_text"** /> 

(** gibt es nur um Ihnen zu zeigen, dass ich android verwenden: Hintergrund statt android: Textfarbe)

diesen Code stürzt ab. "Binary XML datei line # 4 tag benötigt 'drawable' attribute oder child tag um drawable zu definieren. Aber wenn ich es mit android: textColor wie im obigen Link beschrieben versuche, funktioniert es gut. Also muss es das Hintergrundproblem sein. I will keine 9patch-png erstellen, wenn es nicht notwendig ist (im Grunde ich nur ein „klickbaren“ Rechteck muß so verwende ich eine Taste mit einem farbigen Hintergrund)

+0

Konstantin Antwort hat einen Tippfehler - die Linie 'Artikel android: color =“ @ color/black "' .......... Ich schlage vor, es sollte Artikel lesen Android: Drawable = "@ Farbe/schwarz" ........... –

+0

http: // stackoverflow. com/a/15880688/1352919 – Faakhir

Antwort

77

Wie Ihre Fehlerzuständen, Sie haben ziehbar definieren attibute für die Elemente (aus irgendeinem Grund ist es erforderlich, wenn es um Definitionen Hintergrund kommt), so:

<?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/red"/> <!-- pressed --> 
    <item android:state_focused="true" android:drawable="@color/blue"/> <!-- focused --> 
    <item android:drawable="@color/black"/> <!-- default --> 
</selector> 

beachten sie auch, dass ziehbar att ribute akzeptiert keine rohen Farbwerte, daher müssen Sie die Farben als Ressourcen definieren. Erstellen Colors.xml Datei auf res/Werte Ordner:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="black">#000</color> 
    <color name="blue">#00f</color> 
    <color name="red">#f00</color> 
</resources> 
+5

Artikel Android: Farbe = "@ Farbe/Schwarz" s/b Artikel Android: Drawable = "@ Farbe/schwarz" – Noah

+0

@Noah thx, behoben, dass. –

+0

Wenn dies Ihr Problem gelöst hat, akzeptieren Sie dies als Antwort? –

4

Sie haben die selector.xml Datei im drwable Ordner abzulegen. Dann schreiben: android:background="@drawable/selector". Dies sorgt für die gedrückten und fokussierten Zustände.

27

In der URL, die Sie darauf, die button_text.xml verwendet wird, um die Textfarbe zu setzen attribute.That es ist Grund, warum sie die button_text.xml in res/Farbe Ordner hatte und daher verwendet sie @ color/button_text.xml

Aber Sie versuchen, es für Hintergrundattribut zu verwenden. Das Hintergrundattribut sucht nach etwas im res/drawbaren Ordner.

Check diese Ich habe diese Wähler benutzerdefinierte Schaltfläche vom internet.I haben nicht das link.but i das Plakat für this.It danken half dies me.have im ziehbar Ordner

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" > 
     <shape> 
      <gradient 
       android:startColor="@color/yellow1" 
       android:endColor="@color/yellow2" 
       android:angle="270" /> 
      <stroke 
       android:width="3dp" 
       android:color="@color/grey05" /> 
      <corners 
       android:radius="3dp" /> 
      <padding 
       android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
     </shape> 
    </item> 

    <item android:state_focused="true" > 
     <shape> 
      <gradient 
       android:endColor="@color/orange4" 
       android:startColor="@color/orange5" 
       android:angle="270" /> 
      <stroke 
       android:width="3dp" 
       android:color="@color/grey05" /> 
      <corners 
       android:radius="3dp" /> 
      <padding 
       android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
     </shape> 
    </item> 

    <item>   
     <shape> 
      <gradient 
       android:endColor="@color/white1" 
       android:startColor="@color/white2" 
       android:angle="270" /> 
      <stroke 
       android:width="3dp" 
       android:color="@color/grey05" /> 
      <corners 
       android:radius="3dp" /> 
      <padding 
       android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
     </shape> 
    </item> 

</selector> 

und ich in meinem main.xml Layout wie folgt

<Button android:id="@+id/button1" 
      android:layout_alignParentLeft="true" 
      android:layout_marginTop="150dip" 
      android:layout_marginLeft="45dip" 
      android:textSize="7pt" 
      android:layout_height="wrap_content" 
      android:layout_width="230dip" 
      android:text="@string/welcomebtntitle1" 
      android:background="@drawable/custombutton"/> 

Hoffe, dass dies hilft. Vik hat Recht.

EDIT: Hier ist die colors.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="yellow1">#F9E60E</color> 
    <color name="yellow2">#F9F89D</color> 
    <color name="orange4">#F7BE45</color> 
    <color name="orange5">#F7D896</color> 
    <color name="blue2">#19FCDA</color> 
    <color name="blue25">#D9F7F2</color> 
    <color name="grey05">#ACA899</color> 
    <color name="white1">#FFFFFF</color> 
    <color name="white2">#DDDDDD</color> 
</resources> 
+0

Haben Sie die color.xml-Datei dazu? – electrichead

+0

@electrichead - Ja, ich habe es. Ich bearbeite meine Antwort. bitte sehen. – Sreeram

+0

Ich sah diese Antwort zum ersten Mal, als ich anfing, mit Android zu arbeiten, und wurde von der Menge an XML-Code verschont, aber zwei Monate später bin ich wieder darauf gestoßen und es ist eine großartige Antwort auf das generelle Problem beim Erstellen von benutzerdefinierten Schaltflächenfarben , ohne ein Bild zu verwenden. –

2

in Mono Android Sie Filter wie folgt verwenden können:

your_button.Background.SetColorFilter(new Android.Graphics.PorterDuffColorFilter(Android.Graphics.Color.Red, Android.Graphics.PorterDuff.Mode.Multiply)); 
+0

Hintergrund sollte getbackground() lesen. Eine andere Option ist die Verwendung eines solchen Filters: myButton.getBackground(). SetColorFilter (new LightingColorFilter (multiplier, bckgrd_color)); – hornetbzz