2015-09-12 5 views
7

Próbuję zrobić w Androidzie grupę przycisków, które można wybrać i aktywować tylko jeden z nich. Muszę pracować z tą samą logiką radiogrupy i radiobutonów.jaki jest najlepszy sposób na wybranie grupy przycisków, które można niezależnie wybrać i aktywować?

Próbowałem wielu alternatyw, ale chcę najbardziej efektywny sposób. Jak mogę to zrobić?

+0

czy naprawdę chcesz, aby zachowywać się jak zakładki – Michael

+0

Nie chciałem przycisk zachowuje się jak przyciski przełączników dlatego wyjaśniłem, że muszą pracować jak radiobuttons . W każdym razie już to rozwiązałem. –

Odpowiedz

3

Nadal można używać przycisków radiowych w grupie radiowej oraz atrybutów, aby każdy przycisk radiowy wyglądał jak przycisk.

W formacie xml, dla każdego zestawu przycisków radiowych android:button="@null", tak aby kropki nie były widoczne. Możesz dodać dopełnienie, aby wyglądało inaczej.

W kodzie, ustaw CheckedChangeListener na swojej grupie radioGroup, a następnie znajdź odniesienie do checkedView (RadioButton) z checkedId. W tym przykładzie właśnie zmieniłem kolor tła widoku, ale możesz też dodać inne tło. Jeśli parametr radioButton nie ma wartości null, oznacza to, że został już zmieniony, więc ustawię ponownie jego stan początkowy.

radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(RadioGroup group, int checkedId) { 
    if (radioButton != null) { 
     radioButton.setBackgroundColor(Color.TRANSPARENT); 
     radioButton.setButtonDrawable(0); // removes the image 
    } 
    radioButton = (RadioButton) group.findViewById(checkedId); 
    radioButton.setBackgroundColor(Color.YELLOW); 
    radioButton.setButtonDrawable(R.drawable.icon); //sets the image 
    } 
}); 

Mam nadzieję, że to pomoże!

+0

Dzięki za odpowiedź! Nie mogę oznaczyć twojej odpowiedzi jako przydatnej, ponieważ mam reputację. To działa! Ale mam inny problem. Chcę umieścić obraz (.png) po wybraniu przycisku. Czy wiesz, jak to zrobić? –

+0

Nie ma za co! Zmodyfikowałem kod, więc teraz obraz jest dodawany po wybraniu "przycisku" i usuwany po wybraniu innego. –

+0

@DennySchuldt: wspomniałeś 'android: button =" @ null "', aby unieważnić kropki, ale czasami widzisz także 'android: button =" @ android: color/transparent "'. Czy istnieje preferencja? – GeertVc

5

Chociaż można ustawić to w kodzie jak sugeruje Denny Schuldt, jest "czystszy" sposób jest to zrobić w XML (np drawable/radio.xml):

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

i ustawić ją jako button tle: android:background="@drawable/radio"

8

enter image description here

można w ten prosty sposób:

1.activity_button_group.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center_horizontal"> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="A" 
    android:id="@+id/btn0" 
    android:layout_gravity="center_vertical" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="B" 
    android:id="@+id/btn1" 
    android:layout_gravity="center_vertical" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="C" 
    android:id="@+id/btn2" 
    android:layout_gravity="center_vertical" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="D" 
    android:id="@+id/btn3" 
    android:layout_gravity="center_vertical" /> 
</LinearLayout> 

2.ButtonGroupActivity.java

public class ButtonGroupActivity extends Activity implements View.OnClickListener{ 

    private Button[] btn = new Button[4]; 
    private Button btn_unfocus; 
    private int[] btn_id = {R.id.btn0, R.id.btn1, R.id.btn2, R.id.btn3}; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_button_group); 

     for(int i = 0; i < btn.length; i++){ 
      btn[i] = (Button) findViewById(btn_id[i]); 
      btn[i].setBackgroundColor(Color.rgb(207, 207, 207)); 
      btn[i].setOnClickListener(this); 
     } 

     btn_unfocus = btn[0]; 
    } 

    @Override 
    public void onClick(View v) { 
     //setForcus(btn_unfocus, (Button) findViewById(v.getId())); 
     //Or use switch 
     switch (v.getId()){ 
      case R.id.btn0 : 
       setFocus(btn_unfocus, btn[0]); 
       break; 

      case R.id.btn1 : 
       setFocus(btn_unfocus, btn[1]); 
       break; 

      case R.id.btn2 : 
       setFocus(btn_unfocus, btn[2]); 
       break; 

      case R.id.btn3 : 
       setFocus(btn_unfocus, btn[3]); 
       break; 
     } 
    } 

    private void setFocus(Button btn_unfocus, Button btn_focus){ 
     btn_unfocus.setTextColor(Color.rgb(49, 50, 51)); 
     btn_unfocus.setBackgroundColor(Color.rgb(207, 207, 207)); 
     btn_focus.setTextColor(Color.rgb(255, 255, 255)); 
     btn_focus.setBackgroundColor(Color.rgb(3, 106, 150)); 
     this.btn_unfocus = btn_focus; 
    } 
} 
+0

zapomniałeś ustawić początkowy stan przycisku – Michael

+0

Użyłem tego: btn [i] = (Button) findViewById (btn_id [i]); –

Powiązane problemy