Autore Topic: Problema visualizzazione Spinner in Dialog  (Letto 406 volte)

Offline Cleon I

  • Utente junior
  • **
  • Post: 52
  • Sono l'imperatore della galassia
  • Respect: +2
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG L70, Nexus 7 2013, Asus Z300
  • Sistema operativo:
    LinuxMint Cinnamon 18.3
Problema visualizzazione Spinner in Dialog
« il: 10 Marzo 2015, 15:11:12 CET »
0
Ho un problema che non riesco a siolvere (sicuramente è una cavolata che vista da un occhio esterno è di facile soluzione)

Apro un dialog per l'inserimento di alcuni dati in un db, tale dialog ha 3 spinner e un bottone (più le relative TextView di descrizione). Quello che vogliof are è questo, se nello spinner 2 seleziono la scelta 1, lo spinner due viene riempito con uno array, se viene scelta la 2 con un altro se viene scelta la tre è disabilitato. Il tutto funziona (la parte che usa array diversi) però lo spinner viene visualizzato tutto bianco (comprese le scritte) e quindi non si è in grado di leggerne il contenuto.
Eccovi il codice:

Codice (Java): [Seleziona]
ArrayAdapter<String> adapter_veter,  data;
    ArrayAdapter<CharSequence> adapter_tipo, tipo_vacc_antip;
    Spinner spinner_veter, spinner_tipo, spinner_vacc_antip;
........
..........
final Dialog dialogo = new Dialog(this);
                        dialogo.setContentView(R.layout.dialogo_cura);
                        // Inizializza dati textView e Spinner
                        dialogo.setTitle(getString(R.string.agg));
.........
.........
spinner_vacc_antip = (Spinner) dialogo.findViewById(R.id.vacc_antip);
            spinner_tipo = (Spinner) dialogo.findViewById(R.id.tipo_cura);
            adapter_tipo = ArrayAdapter.createFromResource(this, R.array.array_tipo_c, android.R.layout.simple_spinner_item);
            adapter_tipo.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner_tipo.setAdapter(adapter_tipo);
            spinner_tipo.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
            {
                @Override
                public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
                {
                    spinner_vacc_antip.setEnabled(true);
                    spinner_vacc_antip.setAdapter(null);
                    label_tipo.setEnabled(true);
                    switch (position)
                    {
                        case 0: label_tipo.setText("Tipo vaccinazione");
                                tipo_vacc_antip = ArrayAdapter.createFromResource(getApplicationContext(), R.array.array_vacc, android.R.layout.simple_spinner_item);
                                tipo_vacc_antip.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                                spinner_vacc_antip.setAdapter(tipo_vacc_antip);
                                break;
                        case 1: label_tipo.setText("Tipo Antiparassitario");
                                tipo_vacc_antip = ArrayAdapter.createFromResource(getApplicationContext(), R.array.array_anti_p, android.R.layout.simple_spinner_item);
                                tipo_vacc_antip.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                                spinner_vacc_antip.setAdapter(tipo_vacc_antip);
                                //Riempi lo spinner
                                break;
                        case 2: label_tipo.setEnabled(false);
                                label_tipo.setText("");
                                spinner_vacc_antip.setEnabled(false);
                                break;
                    }
                }

                @Override
                public void onNothingSelected(AdapterView<?> parentView)
                {

                }
            });
            ImageButton bottone = (ImageButton) dialogo.findViewById(R.id.salva_dialogo_cura);
                        bottone.setOnClickListener(new View.OnClickListener()
                        {
                                @Override
                public void onClick(View view)
                                {
........
.......
                               });
                        dialogo.show();
.............

C'è qualcosa di errato secondo voi nel codice?  tipo_vacc_antip che il inizializzo direttamente nel case devo inizializzarlo prima?

PS ho allegato screenshot

Post unito: 11 Marzo 2015, 08:55:02 CET
Dopo innumerevoli prove e testardaggine ho risolto in maniera autonoma, per cultura generale vi scrivo la "soluzione"

il problema sta in queste righe all'interno del listener dello spinner

Codice (Java): [Seleziona]
tipo_vacc_antip = ArrayAdapter.createFromResource(getApplicationContext(), R.array.array_vacc, android.R.layout.simple_spinner_item);
come sapete quando creiamo un listener a questo modo facciamo una sorta di sottoclasse (anche se non sono certo funzioni allo stesso modo al 100%) quindi quando scriviamo this non ci riferiamo più alla classe principale (in questo caso una FragmentActivity) ma alla classe che estende il listener.
Quando ho creato questo codice ho avuto ovviamente errore di compilazione legato al this (volevo trattare l'array adapter tipo_vacc_antip come adapter_tipo riportato poco più su). E' nato quindi l'errore dovuto alla mia insesperienza ho sostituito il this con getApplicationContext(), il che non creava nessun errore di compilazione ne di esecuzione (stavo usando un tipo valido) ma portava all'errore di visualizzazione che potete vedere nello screenshot (si parla solo di un errore di visualizzazione visto che lo spinner funzionava a dovere e qualche riga sotto riuscivoa recuperarne il contennuto)
E' bastato (ora dico bastato ma ho commentato e riattivato quasi tutto il codice prima di capire dove stava il problema) sostituire getApplicationContext() con TabAnimale.this (TabAnimale è il nome della classe principale che estende FragmentActivity)

Con gioia clicco il bottone Topic Solved

« Ultima modifica: 11 Marzo 2015, 08:55:02 CET da Cleon I, Reason: Merged DoublePost »
Visita <a href="https://www.wearegeek.it">We are Geek</a>