Autore Topic: la spunta verde delle Checkbox non rimane  (Letto 1775 volte)

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
la spunta verde delle Checkbox non rimane
« il: 13 Aprile 2011, 19:40:03 CEST »
0
Mi sono costruito una dialog di tipo checkbox con tre voci da poter spuntare.
quando ne scelgo una ad esempio, mi mette la spunta verde, poi faccio OK ed esce.
una volta che ci rientro la spunta è sparita... perchè? come faccio a farla rimanere?

Offline elcaurro

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Motorola Atrix, nexus 7, Tab A2, Tab S2
  • Sistema operativo:
    Mac OsX
Re:la spunta verde delle Checkbox non rimane
« Risposta #1 il: 13 Aprile 2011, 19:59:38 CEST »
0
Hai messo in comunicazione l'interfaccia con il resto del sistema solo in fase di input: se tu metti la spunta attivi qualcosa giusto? Esempio:

Codice (Java): [Seleziona]
isChecked = true;
quando riapri la dialog in un secondo momento, per rappresentare lo stato del sistema dovrebbe esserci un controllo tipo:

Codice (Java): [Seleziona]
if (isChecked) mydialog.setChecked=true;
else mydialog.setChecked=false;


considera che quel valore potrebbe essere true di default, ma se non fai in modo che l'interfaccia rappresenti lo stato reale del sistema l'utente non se ne può accorgere.

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #2 il: 13 Aprile 2011, 20:36:47 CEST »
0
non ho capito bene.
io dal menu della activity1, mi apro un'altra activity che costruisce un dialog di tipo checkbox.
quando metto la spunta e premo OK, torno all'activity precedente.

ti posto il codice:
Codice (Java): [Seleziona]
final CharSequence[] items = {"Voce1", "Voce2", "Voce3"};
        /**
         * {@inheritDoc}
         */

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

                this.showDialog(CheckDialog.CUSTOM_DIALOG_ID);
        }

        /**
         * {@inheritDoc}
         */

        protected Dialog onCreateDialog(int id) {
                switch (id) {
        case CheckDialog.CUSTOM_DIALOG_ID:
                        return new AlertDialog.Builder(this).setTitle("Titolo")
                                        .setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener(){
                                                public void onClick(DialogInterface dialog, int item, boolean checked) {
                                            Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
                                            switch (item) {
                                            case 0:
                                                Log.i("LOG","item "+item);
                                                return;
                                            case 1:
                                                Log.i("LOG","item "+item);
                                                return;
                                            case 2:
                                                Log.i("LOG","item "+item);
                                                return;
                                            }
                                        }
                                        })
                                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                                                public void onClick(DialogInterface dialog,     int whichButton) {
                                                                        Intent i = new Intent(getApplicationContext(), MiaActivity.class);
                                                                        startActivity(i);
                                                                }
                                                        }).create();
                }
                        return null;
        }
adesso le tre voci non fanno nulla, ma la spunta non rimane.
come la gestisco in questo caso?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #3 il: 14 Aprile 2011, 15:45:13 CEST »
0
Ti manca la parte relativa all'onPrepareDialog(int, Dialog) e non devi impostare a null il secondo parametro di setMultiChoiceItems

Creating Dialogs | Android Developers
AlertDialog.Builder | Android Developers

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #4 il: 14 Aprile 2011, 18:27:15 CEST »
0
cosa devo mettere nell'onPrepareDialog(int, Dialog)?
il secondo parametro in setMultiChoiceItems è boolean[], anche in questo caso .. cosa ci metto?

ho provato a cambiare in questo modo:
Codice (Java): [Seleziona]
public class CheckDialog extends Activity {
       
        private static final int CUSTOM_DIALOG_ID = 1;
        boolean[] b = {false, false, false};
       
        final CharSequence[] items = {"Voce1", "Voce2", "Voce3"};
 
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                this.setContentView(R.layout.checkdialog);

                this.showDialog(CheckDialog.CUSTOM_DIALOG_ID);
        }

        protected Dialog onCreateDialog(int id) {
                switch (id) {
        case CheckDialog.CUSTOM_DIALOG_ID:            

            AlertDialog.Builder categoryDetailBuilder = new AlertDialog.Builder(this);
            categoryDetailBuilder.setTitle("Titolo").setIcon(R.drawable.pref);
           
            categoryDetailBuilder
                        .setMultiChoiceItems(items, prova, new DialogInterface.OnMultiChoiceClickListener(){
                                public void onClick(DialogInterface dialog, int item, boolean checked) {
                            Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
                            switch (item) {
                            case 0:
                                Log.i("LOG","item "+item);
                                return;
                            case 1:
                                Log.i("LOG","item "+item);
                                return;
                            case 2:
                                Log.i("LOG","item "+item);
                                return;
                            }
                        }
                        })

                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                                public void onClick(DialogInterface dialog,     int whichButton) {
                                                        Intent i = new Intent(getApplicationContext(), MiaActivity.class);
                                                startActivity(i);
                                                }
                                        });
           
            AlertDialog categoryDetail = categoryDetailBuilder.create();
           
            return categoryDetail;
        default:
            break;
                }
                        return null;
        }
       
        protected void onPrepareDialog(int id, Dialog dialog){
                switch (id) {
        case CheckDialog.CUSTOM_DIALOG_ID:
                //AlertDialog categoryDetail = (AlertDialog)dialog;
               
            break;
        default:
            break;
                }
        }

       
}
ma la spunta come rimane una volta che esco da questa activity?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: la spunta verde delle Checkbox non rimane
« Risposta #5 il: 14 Aprile 2011, 19:04:57 CEST »
0
Come fa lui a inventarsi che deve salvare lo stato?

Devi salvarti da qualche parte lo stato quando l'utente chiude il dialog... se tu gli passi l'array di boolean tutto a false ovviamente lui ti mette le checkbox come non selezionate. Devi passargli un array con i valori il modo tale da far selezionare le voci che l'utente aveva selezionato in precedenza.

Sent from my HTC Desire

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #6 il: 14 Aprile 2011, 19:17:18 CEST »
0
non pretendevo che se lo inventasse :D
non sapevo come passargli i valori delle checkbox segnate.

grazie della risp

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #7 il: 15 Aprile 2011, 11:35:25 CEST »
0
ho risolto.
forse in maniera maccheronica.. ma così funziona:
Codice (Java): [Seleziona]
.setMultiChoiceItems(items, prova, new DialogInterface.OnMultiChoiceClickListener(){
        public void onClick(DialogInterface dialog, int item, boolean checked) {
       
                            switch (item) {
                            case 0:
                                Log.i("LOG","tipo1 selezionato");
                                if (checked == false) uno = false;
                                else uno = true;
                                 
                                return;
                            case 1:
                                Log.i("LOG","tipo2 selezionato");
                                if (checked == false) due = false;
                                else due = true;
                                return;
                            case 2:
                                Log.i("LOG","tipo3 selezionato");
                                if (checked == false) tre = false;
                                else tre = true;
                                return;
                            }
                        }
                        }
al button OK gli ho fatto passare i valori del vettore booleano:
Codice (Java): [Seleziona]
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,     int whichButton) {
                                                       
                        boolean[] c = {uno, due, tre};
                        Intent i = new Intent(getApplicationContext(), MiaActivity.class);
                        String pkg = getPackageName(); 
                        i.putExtra(pkg+".myBoolean", c);
                        startActivity(i);
                }
        }

lo metto tra gli snippet così lo spiego meglio?
o c'era un modo migliore per farlo ?
o non ve ne frega niente? :D

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #8 il: 15 Aprile 2011, 12:12:03 CEST »
0
Ma invece di salvare 3 variabili potevi in modo estremamente più semplice fare:

Codice (Java): [Seleziona]
// Tra le variabili membro
private boolean[] checkMultiChoiceItems = new boolean[] {false,false,false};

[...]
// Dentro la tua funzione che gestisce i click
.setMultiChoiceItems(items, checkMultiChoiceItems, new DialogInterface.OnMultiChoiceClickListener(){
        public void onClick(DialogInterface dialog, int item, boolean checked) {
                checkMultiChoiceItems[item] = checked;
        }
}

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #9 il: 15 Aprile 2011, 12:26:15 CEST »
0
ma così facendo non mi posso salvare le check selezionate.
all'avvio della activity io gli passo il vettore boolean con i settaggi precedenti.
mi sbaglio?


cmq il codice che ho postato funziona solo la prima volta...e direi anche ovviamente.
perche gli dico:
if (checked == false) uno = false;
else uno = true;
quindi mette la spunta al primo valore
quando riapro il dialog, se il valore già spuntato lo lascio così, al successivo avvio, la spunta scompare (perche non l'ho checked)

come si fa????

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #10 il: 15 Aprile 2011, 12:34:44 CEST »
0
Le check selezionate sono tutte qui: checkMultiChoiceItems.
Se hai dei valori iniziali allora nell'onCreate scrivi checkMultiChoiceItems = <valori iniziali> invece dell'inizializzazione "= new boolean[] {false,false,false}".

Funziona solo la prima volta perché ancora non hai letto i link che ti ho postato e non hai capito la differenza tra onPrepareDialog e onCreateDialog.

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #11 il: 15 Aprile 2011, 12:50:30 CEST »
0
la differenza credo di averla capita,  o almeno credevo.
Ho il button OK nella onCreateDialog, quindi le azioni le faccio partire da li. non so cosa ci devo mettere nella onPrepare.
A prescindere da quello che voglio fare dopo, per adesso mi accontento di salvare e far ricomparire queste spunte!

mi sto perdendo.. bho

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #12 il: 15 Aprile 2011, 12:54:39 CEST »
0
onCreateDialog viene chiamata solo una volta, alla prima creazione della dialog.
onPrepareDialog viene chiamata tutte le volte che deve essere visualizzata la dialog (poco prima della sua effettiva visualizzazione sul dispositivo.

onCreateDialog deve essere utilizzata per creare il layout della dialog con i suoi valori di default.
onPrepareDialog deve essere utilizzata per riempirne i contenuti.

Era tutto scritto qui: Creating Dialogs | Android Developers
Citazione
When a dialog is requested for the first time, Android calls onCreateDialog(int) from your Activity, which is where you should instantiate the Dialog. This callback method is passed the same ID that you passed to showDialog(int). After you create the Dialog, return the object at the end of the method.

Before the dialog is displayed, Android also calls the optional callback method onPrepareDialog(int, Dialog). Define this method if you want to change any properties of the dialog each time it is opened. This method is called every time a dialog is opened, whereas onCreateDialog(int) is only called the very first time a dialog is opened. If you don't define onPrepareDialog(), then the dialog will remain the same as it was the previous time it was opened. This method is also passed the dialog's ID, along with the Dialog object you created in onCreateDialog()

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #13 il: 15 Aprile 2011, 13:14:48 CEST »
0
il mio problema rimane

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:la spunta verde delle Checkbox non rimane
« Risposta #14 il: 15 Aprile 2011, 13:42:48 CEST »
0
Posta tutto il codice.