2

Je crée un formulaire de saisie de retour qui prend la sélection de l'utilisateur à partir de boutons radio comme ci-dessous.TableLayout du (des) radiogramme (s) avec étiquette (s) respective (s) alignée (s) en android

Desired Output

Alors je pris une disposition de la table et les lignes de table ajoutée avec textviews de largeur fixe en première rangée et une textview avec des boutons radio de largeur fixe pour les lignes restantes

Voici le code de mise en page:

<HorizontalScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <TableLayout 
     android:showDividers="middle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <TableRow> 

      <TextView 
       android:id="@+id/name" 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:text=""/> 


      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:text="Excellent"/> 


      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:text="Very Good"/> 


      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:text="Good"/> 


      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:text="Okay"/> 


      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:text="Bad"/> 


      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:text="Very Bad"/> 


      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:text="Worst"/> 

     </TableRow> 

     <TableRow> 

      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:text="Food Quality"/> 


       <RadioButton 
        android:layout_width="100dp" 
        android:gravity="center_horizontal" 
        android:layout_gravity="center_horizontal" 
        android:layout_height="wrap_content" /> 
       <RadioButton 
        android:layout_width="wrap_content" 
        android:gravity="center_horizontal" 
        android:layout_gravity="center_horizontal" 
        android:layout_height="wrap_content" /> 
       <RadioButton 
        android:layout_width="wrap_content" 
        android:gravity="center_horizontal" 
        android:layout_gravity="center_horizontal" 
        android:layout_height="wrap_content" /> 
       <RadioButton 
        android:layout_width="wrap_content" 
        android:gravity="center_horizontal" 
        android:layout_gravity="center_horizontal" 
        android:layout_height="wrap_content" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 


     </TableRow> 

     <TableRow> 

      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:text="Food Quality"/> 

      <RadioButton 
       android:layout_width="100dp" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 
      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 
      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 
      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 


     </TableRow> 

     <TableRow> 

      <TextView 
       android:layout_width="100dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:text="Food Quality"/> 

      <RadioButton 
       android:layout_width="100dp" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 
      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 
      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 
      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 

      <RadioButton 
       android:layout_width="wrap_content" 
       android:gravity="center_horizontal" 
       android:layout_gravity="center_horizontal" 
       android:layout_height="wrap_content" /> 


     </TableRow> 
    </TableLayout> 


</HorizontalScrollView> 

ce qui me donne une sortie comme celui-ci (horizontalement scrollable)

Obtained output

Le problème est

Comme je l'ai ajouté que les boutons radio sans un utilisateur radiogroup est capable de sélectionner tous les boutons radio dans une seule ligne qui ne devrait pas arriver.

Si j'ajoute le radiogroupe, les boutons radio ne s'alignent pas correctement sur les textviews (étiquettes) de la première rangée.

Quelqu'un peut-il m'aider?

+0

Vous pouvez simplement faire une fonction commune pour toutes les boîtes de radio à décocher. Lorsque l'utilisateur clique sur un bouton radio décochez tous les autres boutons radio par fonction commune, puis utilisez setChecked sur le clic de l'utilisateur :) simple –

+0

Ensuite, tous les boutons radio dans les autres lignes seront décochés .. Si j'ai besoin de mettre en œuvre votre solution j'ai besoin pour garder une carte de la liste des boutons radio et effectuer cette opération qui je pense n'est pas un moyen efficace ... – Manikanta

+0

chère @ Manikanta vous pouvez maintenir une fonction commune pour chaque rangée ainsi –

Répondre

0

Vous pouvez simplement résoudre ce problème avec la mise en œuvre OnCheckedChangeListener

essayer ci-dessous le code, il fonctionnera pour vous-

rb1 = (RadioButton) findViewById(R.id.rb1); 
rb1.setOnCheckedChangeListener(quest1); 
rb2 = (RadioButton) findViewById(R.id.rb1); 
rb2.setOnCheckedChangeListener(quest1); 
rb3 = (RadioButton) findViewById(R.id.rb1); 
rb3.setOnCheckedChangeListener(quest2); 
rb4 = (RadioButton) findViewById(R.id.rb1); 
rb4.setOnCheckedChangeListener(quest2); 

CompoundButton.OnCheckedChangeListener quest1 = new CompoundButton.OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     switch (buttonView.getId()) { 
      case R.id.rb1: 
       rb2.setChecked(false); 
       break; 

      case R.id.rb2: 
       rb1.setChecked(false); 
     } 
    } 
}; 

CompoundButton.OnCheckedChangeListener ques2= new CompoundButton.OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     switch (buttonView.getId()) { 
      case R.id.rb3: 
       rb4.setChecked(false); 
       break; 

      case R.id.rb4: 
       rb3.setChecked(false); 
     } 
    } 
}; 
+0

OMG, j'ai 8 questions chaque question avec 8 boutons radio. Ensuite, avec votre solution, je finis par écrire beaucoup de code redondant .. – Manikanta

+0

Si vous n'utilisez pas le groupe radio, alors ce sera la solution alternative. Vous pouvez également créer 8 objets pour checkChangeListner pour 8 questions. ce qui permettra de réduire votre code, je vais mettre à jour ma réponse pour vous –

+0

Je vais bien avec l'utilisation du groupe radio. mais comment puis-je attaquer l'alignement – Manikanta

0

Parfois, quand vous ne pouvez pas faire des compromis sur la conception, vous devez faire des compromis sur l'efficacité. Vous pouvez y parvenir en ajoutant un simple OnCheckedChangeListener commun à tous les boutons radio.

public CompoundButton.OnCheckedChangeListener onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

     // As all radio buttons have this listener added, 
     // add this check to avoid repetitive execution of code and avoid ripples 

     if (isChecked) { 
      View parent = (View) buttonView.getParent(); 
      RadioButton lastCheckedRadioButton = (RadioButton) parent.getTag(); 
      if (lastCheckedRadioButton != null) { 
       lastCheckedRadioButton.setChecked(false); 
      } 
      parent.setTag(buttonView); 
     } 
    } 
}; 

Quelle est la pire partie?
C'est lorsque vous ajoutez un écouteur à tous les boutons radio.
Si vous pouvez penser à un moyen plus efficace, utilisez votre propre solution, sinon, utilisez cet extrait pour ajouter des écouteurs à tous les boutons radio (en fonction de votre exemple de mise en page).

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout); 
View child; 
TableRow tableRow; 
// As the first line is headings, skip the first row 
for (int i = 1; i < tableLayout.getChildCount(); i++) { 
    child = tableLayout.getChildAt(i); 
    if (child instanceof TableRow) { 
     tableRow = (TableRow) child; 
     // As the first line has labels, skip the first column 
     for (int j = 1; j < tableRow.getChildCount(); j++) { 
      child = tableRow.getChildAt(j); 
      if (child instanceof RadioButton) { 
       ((RadioButton) child).setOnCheckedChangeListener(onCheckedChangeListener); 
      } 
     } 
    } 
} 

REMARQUE: Si vous avez utilisé setTag méthode à d'autres fins, vous pouvez utiliser setTag(R.id.radioButton) et getTag(R.id.radioButton) pour obtenir le résultat