2010-10-10 8 views
1

J'ai un programme simple où je définis un spinner à une position. J'appelle alors un deuxième module et quand je reviens, je réinitialise le spinner. L'affichage du spinner n'affiche pas la valeur du spinner. Lorsque vous appuyez sur le curseur, il pointe vers la valeur correcte, mais il affiche une valeur incorrecte. En fait, il démissionne.Spinner affiche une valeur erronée

J'ai écrit le programme simple suivant pour démontrer. Cela se produit uniquement lorsque le formulaire a un spinner dans une Linearlayout ou TableLayout avec au moins 1 autre élément.

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <TextView 
    android:layout_width="fill_parent" android:layout_height="200dp" 
    android:text="Main Form" /> 

    <LinearLayout android:id="@+id/widget43" 
    android:layout_width="320dp" android:layout_height="wrap_content" 
    android:orientation="horizontal" > 
    <Button 
     android:id="@+id/btn" android:text="Button" android:textSize="16sp"  
     android:layout_width="160dp" android:layout_height="40dp" /> 
    <Spinner 
     android:id="@+id/btnFour" android:textSize="16sp"  
     android:layout_width="160dp" android:layout_height="40dp" /> 
    </LinearLayout>  
</LinearLayout> 

next.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

    <TextView android:id="@+id/id1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Next" 
     /> 
</LinearLayout> 

main.java

package tt.zzz; 

import android.app.Activity; 
import android.os.Bundle; 
import android.content.Intent; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 

public class main extends Activity { 

@Override 
protected void onCreate(Bundle icicle) 
{ 
    super.onCreate(icicle);  
    setContentView(R.layout.main);  
    fillSpinner(); 

    Button btnGo = (Button) findViewById(R.id.btn); 
    btnGo.setOnClickListener(new Button.OnClickListener() { 
    public void onClick(View v) { Go(); } }); 
} 

void Go() { 
    Intent i = new Intent(this, next.class); 
    startActivityForResult(i, 0); 
} 

public void fillSpinner(){ 
    Spinner spin_test = (Spinner) findViewById(R.id.btnFour); 

    ArrayAdapter<CharSequence> myAdapter = 
    new ArrayAdapter<CharSequence>(
    this, 
    android.R.layout.simple_spinner_item 
    ); 
    myAdapter.setDropDownViewResource(
        android.R.layout.simple_spinner_dropdown_item); 

    myAdapter.add("Option 1"); 
    myAdapter.add("Option 2"); 
    myAdapter.add("Option 3"); 

    spin_test.setAdapter(myAdapter); 
    spin_test.setSelection(1); 

    spin_test.setOnItemSelectedListener( 
       new Spinner.OnItemSelectedListener(){ 
       public void onItemSelected(AdapterView<?> 
          arg0,View arg1,int arg2,long arg3){ 
    } 
    public void onNothingSelected(AdapterView<?> arg0) { 
    } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
      Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    fillSpinner(); 
} 
} 

next.java

package tt.zzz; 

import android.app.Activity; 
import android.os.Bundle; 

public class next extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.next); 
    } 
} 

Répondre

0

Essayez d'appeler

@Override 
public void onStart() 
{ 
    super.onStart(); 
    this.fillSpinner(); 
} 

Depuis onCreate appelé une seule fois, afin de mettre à jour Spinner chaque fois que vous devez rafraîchir un autre endroit. onStart() - endroit approprié pour cette

+0

Ok, j'ai essayé cela et il n'a eu aucun impact du tout. La valeur de spinner affichée diminue à chaque cycle, et la valeur affichée indique toujours la valeur correcte, contrairement au spinner effondré. – miannelle

1

je ferais la même chose que Barmaley suggéré, sauf ajouter ce qui suit:

@Override 
public void onResume() 
{ 
    super.onResume(); 
    fillSpinner(); 
} 

La raison pour laquelle ce qui est nécessaire parce que vous lancez une autre activité, de sorte que celui-ci est en pause .

3

Après votre setSelection, ajoutez la ligne suivante:

myAdapter.notifyDataSetChanged();