2012-01-10 4 views
0

Très bien, je suis nouveau à la programmation Android, jusqu'à présent, mon expérience a été très intéressante et stimulante. Mais je crains d'avoir maintenant rencontré le premier problème que je ne suis pas capable de surmonter par moi-même.Android Spinners, changement d'adaptateurs

Autrement dit, tout ce que je veux faire est d'avoir 2 Spinners: 1 pour la sélection des pays 1 pour la province/sélection de l'état

Ce que je veux accomplir est que lorsque l'utilisateur choisit son/son pays la province/state Spinner est mis à jour avec l'adaptateur correct. Actuellement, je n'utilise que 2 pays à des fins de test. Lorsque je lance l'activité, une exception se produit et mon application tombe en panne.

Voici mon code, tous les pointeurs seraient appréciés!

public class ManageAccountActivity extends Activity { 

    final ArrayAdapter<CharSequence> adapterSexe = ArrayAdapter.createFromResource(ManageAccountActivity.this, R.array.sex_array_fr, android.R.layout.simple_spinner_item); 
    final ArrayAdapter<CharSequence> adapterProvince = ArrayAdapter.createFromResource(ManageAccountActivity.this, R.array.province_array_fr, android.R.layout.simple_spinner_item); 
    final ArrayAdapter<CharSequence> adapterStates = ArrayAdapter.createFromResource(ManageAccountActivity.this, R.array.state_array_fr, android.R.layout.simple_spinner_item); 
    final ArrayAdapter<CharSequence> adapterCountry = ArrayAdapter.createFromResource(ManageAccountActivity.this, R.array.country_array_fr, android.R.layout.simple_spinner_item); 

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

     Spinner spinSexe = (Spinner) findViewById(R.id.spin_sex); 
     Spinner spinProvince = (Spinner) findViewById(R.id.spin_province); 
     Spinner spinCountry = (Spinner) findViewById(R.id.spin_country); 

     adapterSexe.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     adapterProvince.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     adapterStates.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     adapterCountry.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     spinSexe.setAdapter(adapterSexe); 
     spinProvince.setAdapter(adapterProvince); 
     spinCountry.setAdapter(adapterCountry); 

     spinCountry.setOnItemSelectedListener(new CountryOnItemSelectedListener()); 
    } 

    public class CountryOnItemSelectedListener implements OnItemSelectedListener { 
     public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
      setContentView(R.layout.account_management); 
      Spinner spinProvince = (Spinner) view.findViewById(R.id.spin_province); 

      if (parent.getItemAtPosition(pos).toString().equals("Canada")) { 
       spinProvince.setAdapter(adapterProvince); 
      } else { 
       spinProvince.setAdapter(adapterStates); 
      } 
     } 

     public void onNothingSelected(AdapterView parent) { 
      // Do nothing. 
     } 
    } 
} 

Voici le message LogCat que je reçois.

01-10 20: 41: 01,024: E/AndroidRuntime (1275): java.lang.RuntimeException: impossible à instancier activité ComposantInfo {gggolf.android.minutegolf/gggolf.android.minutegolf.ManageAccountActivity} : java.lang.NullPointerException

+0

Voici un lien avec des exigences similaires. http: // stackoverflow.com/questions/8078654/dynamic-multiple-spinners-state-city – kosa

+2

Cet extrait de logcat n'explique rien d'autre que vous avez une exception NullPointerException. Vous devez regarder quelle ligne est à l'origine. À ce propos, l'utilisation de 'setContentView' dans l'écouteur ne devrait pas être nécessaire. – Squonk

+0

Vérifiez AndroidManifest.xml. Avez-vous déclaré ManageAccountActivity à cet endroit? – Maxim

Répondre

1

Vous ne pouvez instancier ArrayAdapter directement sur la classe attribut, parce que createFromResource () utilisez Context, et il n'existe pas à ce moment, faites-le dans la méthode onCreate() à la place.

De plus, vous obtenez tour province mal dans votre écoute, vous ne pouvez pas appeler findViewById sur vue variable locale, parce que ce n'est pas votre mise en page, mais un inflate de android.R.layout.simple_spinner_item

Le bon moyen:

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
     Spinner spinProvince = (Spinner) findViewById(R.id.spin_province); 

     if (parent.getItemAtPosition(pos).toString().equals("Canada")) { 
      spinProvince.setAdapter(adapterProvince); 
     } else { 
      spinProvince.setAdapter(adapterStates); 
     } 
    } 
+0

Merci beaucoup d'avoir signalé cela, ça a fait l'affaire! –

+0

Dernière chose, comme [MisterSquonk] (http://stackoverflow.com/a/8810900/1014291) dit, vous pouvez rendre votre code plus simple, en implémentant OnItemSelectedListener directement sur votre activité. – Isshun

+0

En effet, je l'ai déjà fait. Merci encore! –

1

Pourquoi avez-vous setContentView(R.layout.account_management); dans votre méthode onItemSelected()? Cela ne devrait pas être nécessaire.

En outre, vous devez instancier vos adaptateurs dans la méthode onCreate() de votre activité et transmettre votre instance d'activité réelle en tant que contexte.

Et le code pour récupérer l'objet Spinner dans l'auditeur sélectionné doit être changé de

Spinner spinProvince = (Spinner) view.findViewById(R.id.spin_province); 

dans

Spinner spinProvince = (Spinner) findViewById(R.id.spin_province); 

Appel findViewById() sur l'objet de vue local dans votre écouteur select retournera NULL car la vue ne contient pas le Spinner.

1

Essayez d'avoir votre Activity implémenté AdapterView.OnItemSelectedListener lui-même. Remarquez que je l'ai déplacé le Spinners et laissé quelques-uns de votre code et remplacé par des commentaires - assurez-vous de l'inclure si nécessaire ...

public class ManageAccountActivity extends Activity 
    implements AdapterView.OnItemSelectedListener { 

    // Your ArrayAdapters as before 

    Spinner spinSexe = null; 
    Spinner spinProvince = null; 
    Spinner spinCountry = null; 

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

     spinSexe = (Spinner) findViewById(R.id.spin_sex); 
     spinProvince = (Spinner) findViewById(R.id.spin_province); 
     spinCountry = (Spinner) findViewById(R.id.spin_country); 

     // Call setDropDownViewResource on your ArrayAdapters 

     // Call setAdapter on your Spinners 

     spinCountry.setOnItemSelectedListener(this); 
    } 

    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 

     if (parent.getItemAtPosition(pos).toString().equals("Canada")) { 
      spinProvince.setAdapter(adapterProvince); 
     } else { 
      spinProvince.setAdapter(adapterStates); 
     } 
    } 

    public void onNothingSelected(AdapterView parent) { 

    } 
} 
+0

Merci, mon code est beaucoup plus simple maintenant :) –