2013-09-03 21 views
60

czy można utworzyć przycisk przełączania w systemie Android, który ma obraz, ale bez tekstu? Idealnie byłoby to wyglądać tak:Android: Utwórz przycisk przełączania z obrazem i bez tekstu

Toggle Button With Image

Widziałem podobne posty w których odpowiedź była, aby zmienić tło, ale chcę zachować układ Holo lekki i po prostu zamienić tekst z obrazka.

muszę być w stanie programaticallly zmienić źródło obrazu,

Wszelkie pomysły jak ja byłoby to?

Jeśli to nie można zrobić, czy jest sposób, w jaki można włączać i wyłączać normalny przycisk?

+0

Nie to AFAIK nie jest łatwym sposobem zastąpienia tekstu obrazem, a także zamianą całego obrazu tła 2 stanu na taki, jaki chcesz. Możesz spróbować, jeśli możesz ustawić tekst jako obraz za pomocą [ImageSpan] (http://developer.android.com/reference/android/text/style/ImageSpan.html), jak na http://stackoverflow.com/ pytania/7616437/imagespan-in-a-widget – zapl

Odpowiedz

86
  1. mogę zastąpić tekst przełączania z obrazem

    Nie, nie możemy, chociaż możemy ukryć tekst overiding domyślny styl przycisku przełączającego, ale nadal nie będzie daj nam przełącznik, który chcesz, ponieważ nie możemy zastąpić tekstu obrazem.

  2. Jak mogę zrobić normalny przycisk przełączania

    Utwórz plik ic_toggle w folderze res/drawable

    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    
        <item android:state_checked="false" 
          android:drawable="@drawable/ic_slide_switch_off" /> 
    
        <item android:state_checked="true" 
          android:drawable="@drawable/ic_slide_switch_on" /> 
    
    </selector> 
    

    Tutaj @drawable/ic_slide_switch_on & @drawable/ic_slide_switch_off obrazy są tworzone.

    Następnie należy utworzyć inny plik w tym samym folderze, nazwać ic_toggle_bg

    <?xml version="1.0" encoding="utf-8"?> 
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    
        <item android:id="@+android:id/background" 
          android:drawable="@android:color/transparent" /> 
    
        <item android:id="@+android:id/toggle" 
          android:drawable="@drawable/ic_toggle" /> 
    
    </layer-list> 
    

    teraz Dodaj do niestandardowego tematu, (jeśli nie masz utworzyć plik styles.xml w folderze res/values/)

    <style name="Widget.Button.Toggle" parent="android:Widget"> 
        <item name="android:background">@drawable/ic_toggle_bg</item> 
        <item name="android:disabledAlpha">?android:attr/disabledAlpha</item> 
    </style> 
    
    <style name="toggleButton" parent="@android:Theme.Black"> 
        <item name="android:buttonStyleToggle">@style/Widget.Button.Toggle</item> 
        <item name="android:textOn"></item> 
        <item name="android:textOff"></item> 
    </style> 
    

    Spowoduje to utworzenie niestandardowego przycisku przełączającego.

  3. Jak używać

    Użyj niestandardowy styl i tło w widoku.

    <ToggleButton 
         android:id="@+id/toggleButton" 
         android:layout_width="wrap_content" 
         android:layout_height="match_parent" 
         android:layout_gravity="right" 
         style="@style/toggleButton" 
         android:background="@drawable/ic_toggle_bg"/> 
    
+1

To jest genialne dzięki. Czy jest coś, co mogę znaleźć @ drawable/ic_slide_switch_on i wyłączyć obrazy używane do przycisków przełączania Holo Light? – Edd

+2

są w plikach 'sdk \ platforms \ android-17 \ data \ res \ drawable-hdpi' btn_toggle, możesz również zobaczyć ten android-ui-utils.googlecode.com/hg/asset-studio/dist/index.html –

+1

Dziękuję bardzo! gdybym mógł zagłosować więcej niż raz, to bym :) – Edd

52

ToggleButton dziedziczy z TextView tak kanału alfa mają być wyświetlane w 4 granicami tekstu można ustawić.Można używać, aby wyświetlić żądaną ikonę na górze tekstu i ukryć rzeczywisty tekst

<ToggleButton 
    android:id="@+id/toggleButton1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:drawableTop="@android:drawable/ic_menu_info_details" 
    android:gravity="center" 
    android:textOff="" 
    android:textOn="" 
    android:textSize="0dp" /> 

Wynik porównaniu do zwykłej ToggleButton wygląda

enter image description here

Opcja sekund jest użycie ImageSpan, aby faktycznie zastąpić tekst obrazem. Wygląda trochę lepiej, ponieważ ikona jest we właściwej pozycji, ale nie można tego zrobić bezpośrednio za pomocą układu xml.

utworzyć zwykły ToggleButton

<ToggleButton 
    android:id="@+id/toggleButton3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="false" /> 

następnie ustawić „tekst” programmatially

ToggleButton button = (ToggleButton) findViewById(R.id.toggleButton3); 
ImageSpan imageSpan = new ImageSpan(this, android.R.drawable.ic_menu_info_details); 
SpannableString content = new SpannableString("X"); 
content.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
button.setText(content); 
button.setTextOn(content); 
button.setTextOff(content); 

Wynik tutaj w środku - ikona umieszczona jest nieco niższa, ponieważ zajmuje miejsce w tekście .

enter image description here

+0

Dobry pomysł, nigdy nie widziałem opcji do rysowania na togglebutton – Edd

+1

@clairharrison Jeśli masz 'TextView' i' ImageView' często otrzymujesz to: http://stackoverflow.com/questions/8318765/how-do-i-use-a-compound-drawable-instead-of-a-linearlayout-that-contains-an-imag - tak to ja wpadł na ten pomysł :) – zapl

+0

ImageSpan działał świetnie dla mnie. Tak naprawdę chciałem "ToggleButton", który wyglądał jak normalny "Button" (bez niebieskiego paska) z różnymi obrazami włączania/wyłączania, więc odświeżam przycisk ImageSpan na przycisku z nowym obrazem opartym na 'isChecked()'. – Josh

43

tworzyć toggle_selector.xml w RES/rozciągliwej

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/toggle_on" android:state_checked="true"/> 
    <item android:drawable="@drawable/toggle_off" android:state_checked="false"/> 
</selector> 

zastosować przełącznik do przycisku przełączania

<ToggleButton 
      android:id="@+id/chkState" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/toggle_selector" 
      android:textOff="" 
      android:textOn=""/> 

Uwaga: do usuwania tekstu Użyłem w powyższym kodzie

textOff="" 
textOn="" 
+1

Myślę, że to proste. To działało, dziękuję! – Daniel

+1

idealne! to jest prostszy sposób .. –

+4

Czyste i proste!Ta odpowiedź powinna mieć więcej upvotes! – Swayam