2012-08-14 2 views
0

dans le programme, je gonfle plusieurs Spinners et les ajouter à une mise en page. Pour chaque spinner, je fais une sélection individuelle. Cela fonctionne très bien si l'activité est créée comme d'habitude - donc chaque spinner obtient sa propre sélection. Si l'activité est créée en raison d'une rotation, elle appliquera la valeur du dernier spinner à tous les spinner et j'observerai qu'un onItemSelectedListener sera appelé plusieurs fois. Je suis très désespéré car cela ne me semble pas très logique. Voici le code:Android gonflant plusieurs spinner provoque un comportement de sélection étrange

SpinnerTesterActivity.xml

public class SpinnerTesterActivity extends Activity { 
    public String[] array={"s0","s1","s2","s3","s4","s5","s6","s7","s8","s9"}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Log.d("SPINNERTESTER", "REPAINT ACTIVITY"); 
     LinearLayout layout=(LinearLayout)this.findViewById(R.id.parentLayout); 

     for (int i = 0 ; i<3; i++){ 
      LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      ViewGroup reminderLayout = (ViewGroup) layoutInflater.inflate(R.layout.edit_item, null); 
      Spinner spinner = (Spinner) reminderLayout.findViewById(R.id.spinner); 
      spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, array)); 
      spinner.setSelection(i); 

      layout.addView(reminderLayout); 

     } 
    } 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:id="@+id/parentLayout" > 
</LinearLayout> 

edit_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:paddingBottom="3dip" 
    android:paddingTop="3dip" > 

    <Spinner 
     android:id="@+id/spinner" 
     android:layout_width="0px" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="center" /> 

</LinearLayout> 

Répondre

1

Je crois que les fonctions de sauvegarde et de restauration par défaut d'identifier chaque vue par son id, puisque tous vos Spinners ont le même identifiant, ils reçoivent les mêmes données. Il suffit de donner les Spinners leurs propres ids, même un identifiant générique comme ceci:

spinner.setId(i); 

Quelques autres points rapides:

  1. Votre mise en page edit_item.xml a une LinearLayout avec un seul enfant , c'est inutile. Il suffit d'utiliser le Spinner comme l'élément racine:

    <Spinner 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/spinner" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" /> 
    
  2. Vous récupérez la LayoutInflater sur chaque boucle, il vous suffit de le faire une fois.

Tous ensemble:

LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    LinearLayout layout=(LinearLayout)this.findViewById(R.id.parentLayout); 

    for (int i = 0 ; i<3; i++){ 
     Spinner spinner = (Spinner) layoutInflater.inflate(R.layout.spinner, null); 
     spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, array)); 
     spinner.setId(i); 
     spinner.setSelection(i); 

     layout.addView(spinner); 
    } 

Hope that helps!

+0

merci qui a fonctionné. Merci aussi pour les autres conseils. Je viens de développer ce code pour briser le problème jusqu'à l'idée principale. – Anthea

Questions connexes