Comment regrouper une grille 3×3 de boutons radio?

Comme le titre le décrit, j'essaie de regrouper une grille de boutons radio 3×3 dans un seul groupe de radio. Dans une question précédente, j'ai appris que pour que les boutons radio correspondent à un seul groupe, ils devaient être les enfants immédiats du groupe de radio auquel ils correspondraient. J'ai appris cela de manière difficile lorsque j'ai tenté d'encapsuler une disposition de table entière (avec les boutons radio dans les lignes de table) dans un groupe de radio.

Dans ce mur, j'ai essayé ce qui suit:

  • Android: comment puis-je éviter de démarrer une activité qui est déjà en pile?
  • Pourquoi Google a-t-il choisi Renderish au lieu d'OpenCL
  • Problème en veille lors de l'ajout de données dynamiques
  • Texte avec des formes en ressource desséchable
  • Comment envoyer des données à l'application Android pour imprimante bluetooth?
  • Android: pourquoi setVisibility (View.GONE); Ou setVisibility (View.INVISIBLE); ne fonctionnent pas
  • <TableLayout android:id="@+id/table_radButtons" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/title_radGroup_buffer"> <TableRow> <RadioGroup android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:id="@+id/radGroup1"> <RadioButton android:id="@+id/rad1" android:text="Button1" android:layout_width="105px" android:layout_height="wrap_content" android:textSize="13px"></RadioButton> <RadioButton android:id="@+id/rad2" android:text="Button2" android:layout_width="105px" android:textSize="13px" android:layout_height="wrap_content"></RadioButton> <RadioButton android:id="@+id/rad3" android:text="Button3" android:layout_width="105px" android:textSize="13px" android:layout_height="wrap_content"></RadioButton> </RadioGroup> </TableRow> <TableRow> <RadioGroup android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:id="@+id/radGroup1"> <!-- snippet --> </TableRow> <!-- snippet ---> </TableLayout> 

    Évidemment, je n'ai pas appris la première fois parce que je me suis retrouvé dans un mur. J'espérais que les boutons radio dans les différentes lignes de table remarquaient qu'ils faisaient partie du même groupe de radio (donnait à chaque groupe le même identifiant) mais cela ne fonctionnait pas.

    Est-ce que je peux regrouper tous ces boutons dans un seul groupe de radio et maintenir ma structure 3×3 (3 lignes, 3 boutons radio dans chaque ligne)?

  • Problème étrange avec l'intention startActivity, ce qui fait que mon scanner ne fonctionne pas correctement
  • Mettre à jour un plugin Cordova / Phonegap (3.2.0) dans le projet
  • Comment utiliser la caméra Android en arrière-plan?
  • Acceptation SSL auto-signée sur Android
  • L'alerte JavaScript ne fonctionne pas dans Android WebView
  • Conserver l'état du fragment entre les activités
  • 5 Solutions collect form web for “Comment regrouper une grille 3×3 de boutons radio?”

    En fait, ce n'est pas si difficile si vous sous-classe TableLayout comme dans cet exemple

     /** * */ package com.codtech.android.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.RadioButton; import android.widget.TableLayout; import android.widget.TableRow; /** * @author diego * */ public class ToggleButtonGroupTableLayout extends TableLayout implements OnClickListener { private static final String TAG = "ToggleButtonGroupTableLayout"; private RadioButton activeRadioButton; /** * @param context */ public ToggleButtonGroupTableLayout(Context context) { super(context); // TODO Auto-generated constructor stub } /** * @param context * @param attrs */ public ToggleButtonGroupTableLayout(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override public void onClick(View v) { final RadioButton rb = (RadioButton) v; if ( activeRadioButton != null ) { activeRadioButton.setChecked(false); } rb.setChecked(true); activeRadioButton = rb; } /* (non-Javadoc) * @see android.widget.TableLayout#addView(android.view.View, int, android.view.ViewGroup.LayoutParams) */ @Override public void addView(View child, int index, android.view.ViewGroup.LayoutParams params) { super.addView(child, index, params); setChildrenOnClickListener((TableRow)child); } /* (non-Javadoc) * @see android.widget.TableLayout#addView(android.view.View, android.view.ViewGroup.LayoutParams) */ @Override public void addView(View child, android.view.ViewGroup.LayoutParams params) { super.addView(child, params); setChildrenOnClickListener((TableRow)child); } private void setChildrenOnClickListener(TableRow tr) { final int c = tr.getChildCount(); for (int i=0; i < c; i++) { final View v = tr.getChildAt(i); if ( v instanceof RadioButton ) { v.setOnClickListener(this); } } } public int getCheckedRadioButtonId() { if ( activeRadioButton != null ) { return activeRadioButton.getId(); } return -1; } } 

    Et créez une disposition comme celle-ci (bien sûr, vous devez la nettoyer, mais vous avez l'idée)

     <?xml version="1.0" encoding="utf-8"?> <com.codtech.android.view.ToggleButtonGroupTableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/radGroup1"> <TableRow> <RadioButton android:id="@+id/rad1" android:text="Button1" android:layout_width="105px" android:layout_height="wrap_content" android:textSize="13px" /> <RadioButton android:id="@+id/rad2" android:text="Button2" android:layout_width="105px" android:textSize="13px" android:layout_height="wrap_content" /> <RadioButton android:id="@+id/rad3" android:text="Button3" android:layout_width="105px" android:textSize="13px" android:layout_height="wrap_content" /> </TableRow> <TableRow> <RadioButton android:id="@+id/rad1" android:text="Button1" android:layout_width="105px" android:layout_height="wrap_content" android:textSize="13px" /> <RadioButton android:id="@+id/rad2" android:text="Button2" android:layout_width="105px" android:textSize="13px" android:layout_height="wrap_content" /> <RadioButton android:id="@+id/rad3" android:text="Button3" android:layout_width="105px" android:textSize="13px" android:layout_height="wrap_content" /> </TableRow> <TableRow> <RadioButton android:id="@+id/rad1" android:text="Button1" android:layout_width="105px" android:layout_height="wrap_content" android:textSize="13px" /> <RadioButton android:id="@+id/rad2" android:text="Button2" android:layout_width="105px" android:textSize="13px" android:layout_height="wrap_content" /> <RadioButton android:id="@+id/rad3" android:text="Button3" android:layout_width="105px" android:textSize="13px" android:layout_height="wrap_content" /> </TableRow> </com.codtech.android.view.ToggleButtonGroupTableLayout> 

    Après la réponse ci-dessus https://stackoverflow.com/a/2383978/5567009 j'ai eu une autre solution pour cette question, j'ai ajouté d'autres fonctionnalités, comme pour sauvegarder l'état du groupe et les fonctionnalités pour effacer la fonctionnalité de contrôle comme dans le groupe radio .

     import android.content.Context; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.IdRes; import android.util.AttributeSet; import android.view.View; import android.widget.RadioButton; import android.widget.TableLayout; import android.widget.TableRow; public class RadioGridGroup extends TableLayout implements View.OnClickListener { private static final String TAG = "ToggleButtonGroupTableLayout"; private int checkedButtonID = -1; /** * @param context */ public RadioGridGroup(Context context) { super(context); // TODO Auto-generated constructor stub } /** * @param context * @param attrs */ public RadioGridGroup(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override public void onClick(View v) { if (v instanceof RadioButton) { int id = v.getId(); check(id); } } private void setCheckedStateForView(int viewId, boolean checked) { View checkedView = findViewById(viewId); if (checkedView != null && checkedView instanceof RadioButton) { ((RadioButton) checkedView).setChecked(checked); } } /* (non-Javadoc) * @see android.widget.TableLayout#addView(android.view.View, int, android.view.ViewGroup.LayoutParams) */ @Override public void addView(View child, int index, android.view.ViewGroup.LayoutParams params) { super.addView(child, index, params); setChildrenOnClickListener((TableRow) child); } /* (non-Javadoc) * @see android.widget.TableLayout#addView(android.view.View, android.view.ViewGroup.LayoutParams) */ @Override public void addView(View child, android.view.ViewGroup.LayoutParams params) { super.addView(child, params); setChildrenOnClickListener((TableRow) child); } private void setChildrenOnClickListener(TableRow tr) { final int c = tr.getChildCount(); for (int i = 0; i < c; i++) { final View v = tr.getChildAt(i); if (v instanceof RadioButton) { v.setOnClickListener(this); } } } /** * @return the checked button Id */ public int getCheckedRadioButtonId() { return checkedButtonID; } /** * Check the id * * @param id */ public void check(@IdRes int id) { // don't even bother if (id != -1 && (id == checkedButtonID)) { return; } if (checkedButtonID != -1) { setCheckedStateForView(checkedButtonID, false); } if (id != -1) { setCheckedStateForView(id, true); } setCheckedId(id); } /** * set the checked button Id * * @param id */ private void setCheckedId(int id) { this.checkedButtonID = id; } public void clearCheck() { check(-1); } @Override protected void onRestoreInstanceState(Parcelable state) { if (!(state instanceof SavedState)) { super.onRestoreInstanceState(state); return; } SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); this.checkedButtonID = ss.buttonId; setCheckedStateForView(checkedButtonID, true); } @Override protected Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); SavedState savedState = new SavedState(superState); savedState.buttonId = checkedButtonID; return savedState; } static class SavedState extends BaseSavedState { int buttonId; /** * Constructor used when reading from a parcel. Reads the state of the superclass. * * @param source */ public SavedState(Parcel source) { super(source); buttonId = source.readInt(); } /** * Constructor called by derived classes when creating their SavedState objects * * @param superState The state of the superclass of this view */ public SavedState(Parcelable superState) { super(superState); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(buttonId); } public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; } } 

    Et utilisez ceci en XML comme suit

     <com.test.customviews.RadioGridGroup xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_contact" android:layout_height="wrap_content"> <TableRow android:layout_marginTop="@dimen/preview_five"> <RadioButton android:id="@+id/rad1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button1" /> <RadioButton android:id="@+id/rad2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button2" /> </TableRow> <TableRow android:layout_marginTop="@dimen/preview_five"> <RadioButton android:id="@+id/rad3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button3" /> <RadioButton android:id="@+id/rad4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button4" /> </TableRow> <TableRow android:layout_marginTop="@dimen/preview_five"> <RadioButton android:id="@+id/rad5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button5" /> <RadioButton android:id="@+id/rad6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button6" /> </TableRow> <TableRow android:layout_marginTop="@dimen/preview_five"> <RadioButton android:id="@+id/rad7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button7" /> <RadioButton android:id="@+id/rad8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button8" /> </TableRow> </com.test.customviews.RadioGridGroup> 

    Pour toute autre amélioration, veuillez commenter.

    RadioGroup s'étend de la manière suivante ..

     java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.LinearLayout ↳ android.widget.RadioGroup 

    Si vous devez organiser le bouton radio dans une disposition de la grille, vous devrez peut-être créer votre propre code personnalisé qui s'étend de GridLayout .

    Votre seule option est de saisir le code source vers RadioGroup et d'essayer de répliquer ses fonctionnalités dans un TableLayout ou quelque chose. Il n'y a aucun moyen de créer une grille 3×3 de RadioButtons sinon. Heureusement, la classe RadioButton ne connaît pas RadioGroup – toute la logique d'exclusion mutuelle est dans RadioGroup . Par conséquent, il devrait être possible de créer un RadioGrid ou quelque chose … mais cela va être beaucoup de travail.

    C'est une bouchée, mais pourquoi pas pourquoi ne pas utiliser neuf RadioGroups, ou trois RadioGroups horizontaux chacun avec trois boutons. Chaque groupe de radio peut ensuite être aligné avec un gridView, ou relativeLayout, etc.

    Le puis, au lieu d'utiliser l'OnCheckedChangeListener standard de RadioButton, utilise l'un (du même nom) appartenant au bouton Compound à la place.

    Ensuite, lorsque vous appuyez sur un RadioButton, vous pouvez utiliser les groupes de radio pour désélectionner les boutons radio. Ensuite, sélectionnez par programme le bouton radio qui a été cliqué.

    C'est une solution horrible, mais ça fonctionne comme on espère.

    Voici un exemple de code que j'avais l'habitude de faire avec une disposition 2×2 des boutons.

      public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); updateList(Hurricane.ELEVATION_ALL); watermarkAdapter = new WatermarkAdapter(getActivity(), R.layout.watermark_item, relatedHurricanes); setListAdapter(watermarkAdapter); this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); this.getView().setBackgroundResource(R.drawable.splash_screen1); getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); View v = this.getView(); filterGroup1 = (RadioGroup)v.findViewById(R.id.filter_rg1); filterGroup2 = (RadioGroup)v.findViewById(R.id.filter_rg2); filterGroup3 = (RadioGroup)v.findViewById(R.id.filter_rg3); filterGroup4 = (RadioGroup)v.findViewById(R.id.filter_rg4); rb1 = (RadioButton) v.findViewById(R.id.first_radio_button);//All rb2 = (RadioButton) v.findViewById(R.id.second_radio_button);//0-6 rb4 = (RadioButton) v.findViewById(R.id.third_radio_button);//6-12 rb3 = (RadioButton) v.findViewById(R.id.fourth_radio_button);//>=5 rb1.setOnCheckedChangeListener(this); rb2.setOnCheckedChangeListener(this); rb3.setOnCheckedChangeListener(this); rb4.setOnCheckedChangeListener(this); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { filterGroup1.clearCheck(); filterGroup2.clearCheck(); filterGroup3.clearCheck(); filterGroup4.clearCheck(); SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this.getActivity()); int cid = buttonView.getId(); Editor editor = prefs.edit(); int elevation = Hurricane.ELEVATION_ALL; //All if(rb1.getId() == cid){ elevation = Hurricane.ELEVATION_ALL; } //0-6 else if(rb2.getId() == cid){ elevation = Hurricane.ELEVATION_6to12; } //6-12 else if(rb3.getId() == cid){ elevation = Hurricane.ELEVATION_0to6; } //>=12 else if(rb4.getId() == cid){ elevation = Hurricane.ELEVATION_GT12; } update(StormFragment.NORMAL, elevation); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.