Autore Topic: Richiamare spinner da codice  (Letto 634 volte)

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Richiamare spinner da codice
« il: 28 Febbraio 2014, 12:29:06 CET »
0
Ho difficoltà ad avviare lo spinner in base alla preferenza, in questo caso.

Al primo avvia dovrei mostrare lo spinner per effettuare la scelta,
se invece la scelta é stata fatta in pecedenza, quindi non é più il primo avvio, lascio scorrere tutto.

Toast "primo avvio" mostra che la preferenza del primo avvio funziona correttamente ma:
Come faccio a richiamare e far apparire lo spinner affinché possa effettuare la prima scelta?  :-( :-( :-(

Codice (Java): [Seleziona]
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.index);
               
                pref = getSharedPreferences ("FILE_PREF", MODE_PRIVATE);
                String sigla1 = pref.getString("Sigla1", "");
                boolean avvio = pref.getBoolean("Avvio", true);

                if(pref.getBoolean("Avvio", true)){
                        Toast.makeText(this, "primo avvio", Toast.LENGTH_LONG).show();

                        //      s.setSelection(id); // Così non va!
                        // Come richiamo lo spinner?

                }
                               
        s = (Spinner) findViewById(R.id.mio_spinner);
        final ArrayAdapter<CharSequence>
        sceltaLingua = ArrayAdapter.createFromResource(this, R.array.nome_lingua, android.R.layout.simple_spinner_item);
        sceltaLingua.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s.setAdapter(sceltaLingua);
        id = pref.getInt("IdSpinner",0);
        s.setSelection(id);
     
        s.setOnItemSelectedListener(new OnItemSelectedListener() {      
                        @Override
                        public void onItemSelected(AdapterView<?> arg0, View arg1, int pos, long id) {
                                String arraySigle[] = getResources ().getStringArray(R.array.sigla_lingua);            
                                pref = getSharedPreferences ("FILE_PREF", MODE_PRIVATE);
                                editor = pref.edit();
                                editor.putString("Sigla1",arraySigle[pos].toString());
                                editor.putInt("IdSpinner", pos);
                                editor.putBoolean("Avvio", false);
                                editor.commit();
                                btn1.setText(getString(R.string.tmp)+"\n" +s.getSelectedItem().toString());
                                               
                        }

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

                        }
        });
       
        Uri apreweb = Uri.parse(sito1 + sigla1);  
        pref = getSharedPreferences ("FILE_PREF", MODE_PRIVATE);
        Intent browserintent = new Intent(Intent.ACTION_VIEW, apreweb);
        browserintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(browserintent);

Grazie a tutti  :-) :-) :-)

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Richiamare spinner da codice
« Risposta #1 il: 28 Febbraio 2014, 14:18:14 CET »
0
Vuoi fare aprire lo spinner senza che l'utente ci clicchi sopra ho capito bene?

Fai così:
Codice: [Seleziona]
                Spinner spinner = (Spinner) findViewById(R.id.tuo_spinner);
                spinner.performClick();

Ciao

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Re:Richiamare spinner da codice
« Risposta #2 il: 01 Marzo 2014, 09:39:33 CET »
0
Grazie "arlabs",  :-) :-) :-)
con il tuo suggerimento ho modificato il codice e adesso funziona bene, allego le modifiche funzionanti.

Codice (Java): [Seleziona]
                boolean avvio = pref.getBoolean("Avvio", true);

         if(pref.getBoolean("Avvio", true)){
                 Toast.makeText(this, "primo avvio", Toast.LENGTH_LONG).show();
                 s = (Spinner) findViewById(R.id.mio_spinner);
                 final ArrayAdapter<CharSequence>
                 sceltaLingua = ArrayAdapter.createFromResource(this, R.array.nome_lingua, android.R.layout.simple_spinner_item);
                 sceltaLingua.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                 s.setAdapter(sceltaLingua);
                 id = pref.getInt("IdSpinner",0);
                 s.setSelection(id);
                 s.performClick();
         }
         else{
                Uri apreweb = Uri.parse(sito1 + sigla1);  
                pref = getSharedPreferences ("FILE_PREF", MODE_PRIVATE);
                Intent browserintent = new Intent(Intent.ACTION_VIEW, apreweb);
                browserintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(browserintent);
         }      
        s = (Spinner) findViewById(R.id.mio_spinner);
        final ArrayAdapter<CharSequence>
        sceltaLingua = ArrayAdapter.createFromResource(this, R.array.nome_lingua, android.R.layout.simple_spinner_item);
        sceltaLingua.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s.setAdapter(sceltaLingua);
        id = pref.getInt("IdSpinner",0);
        s.setSelection(id);
     
        s.setOnItemSelectedListener(new OnItemSelectedListener() {      
                        @Override
                        public void onItemSelected(AdapterView<?> arg0, View arg1, int pos, long id) {
                                String arraySigle[] = getResources ().getStringArray(R.array.sigla_lingua);            
                                pref = getSharedPreferences ("FILE_PREF", MODE_PRIVATE);
                                editor = pref.edit();
                                editor.putString("Sigla1",arraySigle[pos].toString());
                                editor.putInt("IdSpinner", pos);
                                editor.putBoolean("Avvio", false);
                                editor.commit();
                                btn1.setText(getString(R.string.tmp)+"\n" +s.getSelectedItem().toString());
                                               
                        }

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

                        }
        });

Come potrei semplificarlo?
Per esempio il codice che gestisce l'array dello spinner adesso risulta duplicato.
Apprezzo esempi e suggerimenti.
Saluti a tutti.

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Richiamare spinner da codice
« Risposta #3 il: 03 Marzo 2014, 09:14:12 CET »
0
Sposti la parte comune prima dell'IF?

Codice (Java): [Seleziona]
        s = (Spinner) findViewById(R.id.mio_spinner);
        final ArrayAdapter<CharSequence>
        sceltaLingua = ArrayAdapter.createFromResource(this, R.array.nome_lingua, android.R.layout.simple_spinner_item);
        sceltaLingua.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s.setAdapter(sceltaLingua);
        id = pref.getInt("IdSpinner",0);
        s.setSelection(id);

        s.setOnItemSelectedListener(new OnItemSelectedListener() {      
                        @Override
                        public void onItemSelected(AdapterView<?> arg0, View arg1, int pos, long id) {
                                String arraySigle[] = getResources ().getStringArray(R.array.sigla_lingua);            
                                pref = getSharedPreferences ("FILE_PREF", MODE_PRIVATE);
                                editor = pref.edit();
                                editor.putString("Sigla1",arraySigle[pos].toString());
                                editor.putInt("IdSpinner", pos);
                                editor.putBoolean("Avvio", false);
                                editor.commit();
                                btn1.setText(getString(R.string.tmp)+"\n" +s.getSelectedItem().toString());
                                               
                        }

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

                        }
        });

        boolean avvio = pref.getBoolean("Avvio", true);

         if(pref.getBoolean("Avvio", true)){
                 Toast.makeText(this, "primo avvio", Toast.LENGTH_LONG).show();
                 s.performClick();
         }
         else{
                Uri apreweb = Uri.parse(sito1 + sigla1);  
                pref = getSharedPreferences ("FILE_PREF", MODE_PRIVATE);
                Intent browserintent = new Intent(Intent.ACTION_VIEW, apreweb);
                browserintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(browserintent);
         }      
     

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Re:Richiamare spinner da codice
« Risposta #4 il: 04 Marzo 2014, 16:07:46 CET »
0
PROBLEMA:
richiamare lo spinner al primo avvio con spinner.performClick() come suggerito da "arlabs" funziona correttamente su android 2.x.x, invece su android 4.x.x genera il seguente errore:
----------------------------------
Unable to start activity Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
----------------------------------
Impossibile avviare l'activity, causa: android.view.WindowManager$BadTokenException: impossibile aggiungere la schermata -- token nullo o non valido, la tua activity é in esecuzione ?
---------------------------------
Ho letto che si può correggere specificando il nome della mia activity davanti a this, cosa che io ho fatto:

Codice (Java): [Seleziona]
ArrayAdapter.createFromResource(HomeActivity.this, R.array.nome_lingua,android.R.layout.simple_spinner_item);ma l'errore persiste.
Disabilitando s.performClick(); l'errore non si verifica, ma ovviamente non mi viene mostrato automaticamente lo spinner al primo avvio.
Suggerimenti su come risolverlo?
il problema si manifesta solamente mandando in esecuzione su android 4.

Grazie e saluti a tutti.

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Richiamare spinner da codice
« Risposta #5 il: 04 Marzo 2014, 16:12:11 CET »
0
Fa la stessa cosa anche se lo sposti nella onResume?

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Re:Richiamare spinner da codice
« Risposta #6 il: 04 Marzo 2014, 22:19:58 CET »
0
Si purtroppo, ho provato ma stesso problema.

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Re:Richiamare spinner da codice
« Risposta #7 il: 07 Marzo 2014, 12:08:46 CET »
0
Ecco come ho superato il problema:

Codice (Java): [Seleziona]
private Handler h; // definisco un Handler dello spinnersu onCreate:
Codice (Java): [Seleziona]
                boolean avvio = pref.getBoolean("Avvio", true);

         if(pref.getBoolean("Avvio", true)){
                h = new Handler();
             // Genero un thread che attiva il Spinner e apro dopo 1 secondi ...
             new Thread(new Runnable() {
                 public void run() {
                     // NON TENTARE DI AGGIORNARE DIRETTAMENTE LA UI, NON FUNZIONERà!
                     // è NECESSARIO CONDIVIDERE IL GESTORE DELL'INTERFACCIA UTENTE "UI"
                     h.postDelayed(new Runnable() {
                         public void run() {
                             // Apro lo Spinner...
                                 s.performClick();
                         }
                     }, 1000);
                 }
             }).start();
         }
         else{

Fonte:http://stackoverflow.com/questions/2679804/possible-to-programmatically-open-a-spinner-in-android-app

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Richiamare spinner da codice
« Risposta #8 il: 07 Marzo 2014, 13:59:13 CET »
0
Scusa, ma se usi l'handeler che gira nel Looper della UI (corretamente) con un postDelayed.... a che ti serve il thread?

No potresti fare semplicemente così?

Codice: [Seleziona]
h = new Handler();
h.postDelayed(new Runnable() {
                         public void run() {
                             // Apro lo Spinner...
                                 s.performClick();
                         }
                     }, 1000);

Offline astropegaso61

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
Re:Richiamare spinner da codice
« Risposta #9 il: 10 Marzo 2014, 10:15:07 CET »
0
Grazie del suggerimento arlabs,
in effetti mi ero limitato ad applicare quanto letto sul forum citato,
la tua osservazione é impeccabile.