Autore Topic: checkbox che aggiunge uno spinner dinamico...  (Letto 926 volte)

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
checkbox che aggiunge uno spinner dinamico...
« il: 19 Novembre 2010, 23:52:24 CET »
0
Salve,

devo effettuare questa serie di cose:
1) seleziono la checkbox che
2) mi crea dinamicamente uno Spinner che riempio con un arrai preimpostato e
3) alla selezione di uno degli elementi mi chiude l'Activity attuale e mi passa alla precedente.

Ho scritto questo:
Codice (Java): [Seleziona]
        CheckBox isSelected = (CheckBox)findViewById(R.id.checkBox_gps);
        isSelected.setOnCheckedChangeListener(new OnCheckedChangeListener(){
                        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                               
                                if(isChecked){
                                        savePrefSensorSelected(true);
                                       
                                        dynamicContent = true;
                                        // dynamically adding a spinner...
                                        spin = new Spinner(getApplicationContext());
                                        ArrayAdapter<CharSequence> fAdapter;
                                        fAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.update_freq_string, android.R.layout.simple_spinner_dropdown_item);
                                        int spinner_dd_item = android.R.layout.simple_spinner_dropdown_item;
                                        fAdapter.setDropDownViewResource(spinner_dd_item);
                                        Spinner updateFreqSpinner = spin;
                                        updateFreqSpinner.setAdapter(fAdapter);
                                        LinearLayout ll = (LinearLayout)findViewById(R.id.linear_layout_gps);
                                        ll.addView(spin, 3);
                                       
                                        spin.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){

                                                public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                                                        int freq;
                                                       
                                                        freq=spin.getSelectedItemPosition();
                                                        savePref(freq);
                                                        Intent result = new Intent();
                                                        setResult(RESULT_OK, result);
                                                        finish();
                                                }

                                                public void onNothingSelected(AdapterView<?> arg0) {
                                                        // TODO Auto-generated method stub
                                                       
                                                }
                                               
                                        });
                                }
                                else{
                                        savePrefSensorSelected(false);
                                        dynamicContent = false;
                                }
                        }
        });

che mi rende quest'errore quando tento di selezionare un elemento dal nuovo spinner creato:
Codice: [Seleziona]
11-19 23:37:54.908: ERROR/AndroidRuntime(2113): FATAL EXCEPTION: main
11-19 23:37:54.908: ERROR/AndroidRuntime(2113): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.view.ViewRoot.setView(ViewRoot.java:509)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.app.Dialog.show(Dialog.java:241)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.widget.Spinner.performClick(Spinner.java:257)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.view.View$PerformClick.run(View.java:8816)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.os.Handler.handleCallback(Handler.java:587)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.os.Looper.loop(Looper.java:123)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at java.lang.reflect.Method.invokeNative(Native Method)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at java.lang.reflect.Method.invoke(Method.java:521)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-19 23:37:54.908: ERROR/AndroidRuntime(2113):     at dalvik.system.NativeStart.main(Native Method)

...dove erro?  ???

Grazie!

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #1 il: 20 Novembre 2010, 16:44:10 CET »
0
proprio nessuno nessuno che mi aiuta? :P

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #2 il: 20 Novembre 2010, 16:53:15 CET »
+1
Alcune piccole note:

1)Secondo me non ti conviene aggiungere lo spinner a runtime, potresti includerlo nel layout e renderlo visibile/nasconderlo all'occorrenza usando il metodo setVisibility anche perchè se uno seleziona, poi deseleziona e poi riseleziona viene aggiunto due volte?
2)La posizione selezionata è il terzo parametro del metodo onItemSelected, non ti serve chiamare spin.getSelectedItemPosition();
3)L'oggetto result non serve a niente, puoi evitare di crearlo e di passarlo tramite la setResult che ha appunto un overload che accetta un solo parametro.
4)Prova a togliere il finish e a vedere se non crasha, nel caso in problema sta proprio li e quindi si può pensare a una soluzione
5)NON usare getApplicationContext(), usa NomeActivity.this
« Ultima modifica: 20 Novembre 2010, 16:57:37 CET da Ricky` »

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #3 il: 20 Novembre 2010, 17:11:20 CET »
0
Allora ho trasformato un po le cose seguendo alcuni dei tuoi consigli (ho comunque mantenuto la creazione dinamica dello spinner):

Codice (Java): [Seleziona]
CheckBox isSelected = (CheckBox)findViewById(R.id.checkBox_gps);
        isSelected.setOnCheckedChangeListener(new OnCheckedChangeListener(){
                        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                               
                                if(isChecked && uniqueSpin){
                                        uniqueSpin = false;
                                       
                                        savePrefSensorSelected(true);
                                       
                                        dynamicContent = true;
                                        // dynamically adding a spinner...
                                        spin = new Spinner(getApplicationContext());
                                        ArrayAdapter<CharSequence> fAdapter;
                                        fAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.update_freq_string, android.R.layout.simple_spinner_dropdown_item);
                                        int spinner_dd_item = android.R.layout.simple_spinner_dropdown_item;
                                        fAdapter.setDropDownViewResource(spinner_dd_item);
                                        Spinner updateFreqSpinner = spin;
                                        updateFreqSpinner.setAdapter(fAdapter);
                                        LinearLayout ll = (LinearLayout)findViewById(R.id.linear_layout_gps);
                                        ll.addView(spin, 3);
                                        Log.v(TAG, "Spinner create");
                                       
                                        spin.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
                                                public void onItemSelected(AdapterView<?> parent,       View view, int freq, long id) {
                                                        savePref(freq);
                                                        setResult(RESULT_OK);
                                                        //finish();
                                                       
                                                        Log.v(TAG, "set element");
                                                }

                                                public void onNothingSelected(AdapterView<?> arg0) {
                                                        // TODO Auto-generated method stub     
                                                }
                                        });
                                       
                                }
                                else{
                                        LinearLayout ll = (LinearLayout)findViewById(R.id.linear_layout_gps);
                                        if(dynamicContent){
                                                ll.removeViewAt(3);
                                                uniqueSpin = true;
                                        }
                                        savePrefSensorSelected(false);
                                        dynamicContent = false;
                                }
                        }
        });

ma quando seleziono lo spinner, crasha e mi rende questo errore nel LogCat:

Codice: [Seleziona]
11-20 17:09:36.496: ERROR/AndroidRuntime(27458): FATAL EXCEPTION: main
11-20 17:09:36.496: ERROR/AndroidRuntime(27458): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.view.ViewRoot.setView(ViewRoot.java:509)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.app.Dialog.show(Dialog.java:241)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.widget.Spinner.performClick(Spinner.java:257)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.view.View$PerformClick.run(View.java:8816)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.os.Handler.handleCallback(Handler.java:587)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.os.Looper.loop(Looper.java:123)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at java.lang.reflect.Method.invokeNative(Native Method)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at java.lang.reflect.Method.invoke(Method.java:521)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-20 17:09:36.496: ERROR/AndroidRuntime(27458):     at dalvik.system.NativeStart.main(Native Method)

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application questo e' il problema, ma cercando non ho trovato nulla...

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #4 il: 20 Novembre 2010, 17:17:28 CET »
0
SCUSA Ricky...sono una pera! :)
non avevo applicato il 5)NON usare getApplicationContext(), usa NomeActivity.this....infatti il problema stava li!! :)

Pero, c'e' ancora il fatto della finish()... perche' io volevo che alla selezione di una delle voci dello spinner, mi riportasse all'activity precedente...ma il fatto e' che mi fa uscire subito, selezionando la prima della lista, senza possibilita' di interazione.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #5 il: 20 Novembre 2010, 17:24:21 CET »
0
Pero, c'e' ancora il fatto della finish()... perche' io volevo che alla selezione di una delle voci dello spinner, mi riportasse all'activity precedente...ma il fatto e' che mi fa uscire subito, selezionando la prima della lista, senza possibilita' di interazione.

Scusa non capisco cosa vuoi dire...

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #6 il: 20 Novembre 2010, 17:36:47 CET »
0
avrei voluto che, alla selezione di un elemento della lista, mi riportasse all'activity "madre"...ma se inserisco il metodo finish dove l'ho messo, non mi fa selezionare nulla, cioe', in un secondo mi visualizza lo spinner e poi mi butta all'activity "madre", senza che io possa selezionare nessuna voce dalla lista...

Ora sono stato piu chiaro?

P.s. ho messo topic risolto perche' il "main theme" e' stato chiarito! :)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #7 il: 20 Novembre 2010, 17:41:56 CET »
0
Il codice mi sembra corretto, metti dei tracciamenti ingiro per vedere che chiamate vengono fatte.

Ma perchè fai?
Spinner updateFreqSpinner = spin;

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #8 il: 20 Novembre 2010, 17:49:52 CET »
0
per poi fare

Codice: [Seleziona]
spin.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){ [...]

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #9 il: 20 Novembre 2010, 17:52:31 CET »
0
Uhm non si seguo.
Prova a vedere con dei tracciamenti se il metodo onItemSelected viene invocato non appena si apre lo spinner.
« Ultima modifica: 20 Novembre 2010, 17:55:02 CET da Ricky` »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #10 il: 20 Novembre 2010, 17:58:51 CET »
0
devi usare onItemClickListener, il selected mi pare sia quando dai il focus ad un elemento. Ecco perchè si chiude subito, va in autoselect sulla prima, prova a cambiare in onItemClickListener!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #11 il: 20 Novembre 2010, 18:06:14 CET »
0
devi usare onItemClickListener, il selected mi pare sia quando dai il focus ad un elemento. Ecco perchè si chiude subito, va in autoselect sulla prima, prova a cambiare in onItemClickListener!

Avevo suggerito anche io questa cosa, prima di editare il messaggio, ma poi mi sono accorto che non è supportato nello Spinner:

http://developer.android.com/reference/android/widget/Spinner.html#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener)

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #12 il: 20 Novembre 2010, 18:20:24 CET »
0
Uhm non si seguo.
Prova a vedere con dei tracciamenti se il metodo onItemSelected viene invocato non appena si apre lo spinner.

Ho tracciato, e spin.setOnItemSelectedListener( [...] col rispettivo metodo onItemSelected([...] si apre appena viene creato lo Spinner.

Come mai? Non dovrebbe essere un listener che si attiva quando seleziono l'elemento?

A questo punto mi viene un altra domanda: esiste un metodo per dire che, attualmente, nessun elemento dello spinner e' selezionato?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:checkbox che aggiunge uno spinner dinamico...
« Risposta #13 il: 20 Novembre 2010, 18:29:34 CET »
0
Aspè aspè io avevo fatto una cosa del genere!

Intercettare l'apertura di uno spinner o il click dell'utente su un item - Android Developers Italia

Avevo esteso la classe Spinner per intercettare il click :) Prova a vedere se dentro riesci a recuperare l'item selezionato con il metodo getSelectedItemPosition()