2012-04-15 2 views

Antwort

6

Wenn Sie es mit XML-Datei versuchen, dann müssen Sie jeden Selektor für jede Schaltfläche erstellen.

So versuchen, dynamisch zu tun, indem entweder die StateListDrawable Subklassen oder den Code unten versuchen, die dynamisch Selektor erzeugt :::

StateListDrawable states = new StateListDrawable(); 
states.addState(new int[] {android.R.attr.state_pressed}, 
    getResources().getDrawable(R.drawable.pressed)); 
states.addState(new int[] {android.R.attr.state_focused}, 
    getResources().getDrawable(R.drawable.focused)); 
states.addState(new int[] { }, 
    getResources().getDrawable(R.drawable.normal)); 
imageView.setImageDrawable(states); 
+0

Vielen Dank für die Lösung. –

+0

Funktioniert gut; Ebenso wie im XML können Zustände kombiniert und negiert werden (mit einem "-"). so gedrückt = true checked = false übersetzt in: states.addState (new int [] {android.R.attr.state_pressed, -android.R.attr.state_checked}); Siehe: http://StackOverflow.com/questions/5092649 –

+0

groß ..! Gibt es eine Liste der Staaten, die für andriod.R.attr. * zur Verfügung stehen? –

0

Sie müssen keine XML-Wähler für jede Ihrer Schaltflächen erstellen, einfach Verwenden Sie den, der passt. Ich verwende den folgenden Code in meinem Projekt für viele Schaltflächen mit dem Selektor und anderen Attributen, die identisch sind.

<LinearLayout android:id="@+id/group_news" style="@style/main_button_group" > 
    <ImageView android:id="@+id/image_news" style="@style/main_button_image" android:src="@drawable/news" /> 
    <TextView android:id="@+id/text_news" style="@style/main_button_text" android:text="@string/button_news" /> 
</LinearLayout> 

(Anmerkung: Ich benutze ein Linearlayout mit einem Image und einen Textview und nicht einem Textview mit dem drawableLeft Attribute, weil ich die Bilder im Code bin ersetzen Ändern der drawableLeft nicht richtig funktioniert.)

Und dann ein styles.xml in den res erstellen \ Werte Ordner mit allen attribures, die gleich für die Tasten wie sind:

<resources> 
    <style name="main_button_group"> 
     <item name="android:layout_width">fill_parent</item> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:orientation">horizontal</item> 
     <item name="android:layout_marginTop">2dp</item> 
     <item name="android:paddingTop">10dp</item> 
     <item name="android:paddingBottom">10dp</item> 
     <item name="android:paddingRight">10dp</item> 
     <item name="android:paddingLeft">25dp</item> 
     <item name="android:background">@drawable/main_button_states</item> 
     <item name="android:focusable">true</item> 
     <item name="android:clickable">true</item> 
    </style> 
    <style name="main_button_image"> 
     <item name="android:layout_width">wrap_content</item> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:layout_gravity">center_vertical</item> 
     <item name="android:contentDescription">@string/empty</item> 
    </style> 
    <style name="main_button_text"> 
     <item name="android:layout_width">fill_parent</item> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:layout_margin">10dp</item> 
     <item name="android:layout_gravity">center_vertical</item> 
     <item name="android:gravity">center_horizontal</item> 
     <item name="android:textSize">20dp</item> 
     <item name="android:textColor">@color/general_value</item> 
    </style> 
</resources> 

der Selektor @ ziehbar/main_button_states sieht wie folgt aus:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:drawable="@drawable/main_button_pressed" /> 
    <item android:state_focused="true" android:drawable="@drawable/main_button_focused" /> 
    <item android:state_hovered="true" android:drawable="@drawable/main_button_focused" /> 
    <item android:drawable="@drawable/main_button_normal" /> 
</selector> 

Dies funktioniert perfekt.

+0

Aber wir müssen alle Selektoren separat rechts erstellen.Was ich frage, gibt es eine Möglichkeit, alle Selektor-Codes in einer einzigen Datei oder auf irgendeine Weise zu schreiben, sie wiederzuverwenden. –

+0

@DileepPerla, jeder Selektor ist in seiner separaten Datei. Sie identifizieren sie mit dem Dateinamen (_ @ drawable/main_button_states_ ist die Datei _main_button_states.xml_ im Ordner _drawable_) – infero

+0

Ich habe es. Der Aufruf der Selektor-XML ist für mich kein Problem. Ich wollte nur die Anzahl der Selektor-XML-Dateien optimieren. –

Verwandte Themen