2010-08-31 13 views
12

Hi,caselle di controllo alternata a MultiChoice AlertDialog in Android

ho creato il MultiChoice AlertDialog L'AlertDialog ha cinque voci di elenco con caselle di controllo. Quando I spunta la casella First, w.r.t questo il se sono spuntate le altre checkbox nella lista esse devono essere deselezionate automaticamente e viceversa.

Sto controllando il IsChecked stato nel metodo onClick di OnMultiChoiceClickListener() e chiamando il showDialog (DIALOG_MULTIPLE_CHOICE); aggiornando booleano [] checkedItems; per ricreare la finestra di dialogo , ma non riesco a raggiungerlo. Se avete qualche suggerimento, vi preghiamo di indirizzare direttamente allo .

C'è un modo per ricreare l'evento onClick AleartDialog del clic del pulsante di opzione.

alcuni esempi di codice di seguito:

case DIALOG_MULTIPLE_CHOICE: 
final String[] lJobTypes = { "Item1", "Item2", "Item3","Item4", "Item5" }; 
    return new AlertDialog.Builder(JoblistPage.this) 
    // .setIcon(R.drawable.logo) 
    .setTitle("Title Here") 
    // .setCustomTitle(m_Title) 
    .setMultiChoiceItems(lTypes, m_Selections, 
     new DialogInterface.OnMultiChoiceClickListener() { 

      public void onClick(DialogInterface dialog,int whichButton, boolean isChecked) { 
       /* User clicked on a check box do some stuff */ 
       if (isChecked) { 
        m_CheckCount++; 
        //Toggle the Radio button Check status 
       } else { 
        m_CheckCount--; 
       } 
               } 
     }).setPositiveButton("Ok", 
     new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface dialog, 
        int whichButton) { 
        } 
       }).create(); 

saluti Vinayak

+0

Intendevi utilizzare un RadioButton? Quali sono tutti gli attributi? Perché non inserisci parte del codice per rimuovere alcune delle congetture? – jacknad

+0

HI JackN, ho aggiornato la domanda con il codice, che può rendere più chiaro –

risposta

19

Non ricreare la finestra di dialogo, basta attivare e disattivare le caselle di controllo nella finestra di dialogo corrente. Il tuo onMultiChoiceClickListener può tenere traccia della casella di controllo attualmente attiva (se presente) e deselezionarla quando un'altra è selezionata. Ecco un completo collaudato, esempio di lavoro:

package com.stackoverflow.beekeeper; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.AlertDialog.Builder; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.content.DialogInterface.OnMultiChoiceClickListener; 
import android.os.Bundle; 
import android.widget.ListView; 
import android.widget.Toast; 

public class StackOverflowTest extends Activity { 
    /** Called when the activity is first created. */ 
    @Override public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    } 

    private int mSelected = -1; 

    @Override protected void onResume() { 
    super.onResume(); 
    final Builder build = new Builder(this); 
    build.setTitle("List selection"); 
    build.setCancelable(true); 
    final String[] strings = new String[]{"Cow", "Horse", "Goat"}; 
    final OnMultiChoiceClickListener onClick = 
     new OnMultiChoiceClickListener() { 
     @Override public void onClick(final DialogInterface dialog, 
             final int which, final boolean isChecked) { 

      if (isChecked) { 
      if ((mSelected != -1) && (mSelected != which)) { 
       final int oldVal = mSelected; 
       final AlertDialog alert = (AlertDialog)dialog; 
       final ListView list = alert.getListView(); 
       list.setItemChecked(oldVal, false); 
      } 
      mSelected = which; 
      } else 
      mSelected = -1; 
     } 
     }; 
    build.setMultiChoiceItems(strings, null, onClick); 
    build.setPositiveButton("Done", new OnClickListener() { 
     @Override public void onClick(final DialogInterface dialog, 
            final int which) { 
     String message = null; 
     if (mSelected == -1) 
      message = "You didn't select anything."; 
     else 
      message = "You selected '" + strings[mSelected] + "'"; 
     Toast.makeText(StackOverflowTest.this, message, Toast.LENGTH_LONG).show(); 
     } 
    }); 
    build.show(); 
    } 
} 

Una cosa da guardare per: è necessario specificare "null" per il parametro "CheckedItems" nella chiamata "setMultiChoiceItems" - altrimenti la "setItemChecked" chiamate non lo farà lavorare come previsto Finirebbe usando quell'array per memorizzare lo stato controllato, e "setItemChecked" non lo aggiornerebbe correttamente, quindi tutto sarebbe confuso. Strano, ma vero.

2

Hai provato sostituendo setMultiChoiceItems-setSingleChoiceItems nella tua finestra?

+0

Quindi non ci sarebbe alcuna questione di attivare le caselle di controllo ... Voglio scelta multipla in quanto questa funzione di commutazione (checklist lista1 è spuntata quindi List2, list3.list4, list5 deve essere deselezionato e se uno qualsiasi dei 2,3,4 o 5 è selezionato, la casella di controllo list1 shub deve essere deselezionata) –

+0

Inoltre, tenere conto di quale pulsante è stato premuto sulla posizione.Controlla il parametro chiamato "chebutton" dovrebbe darti la posizione dell'elemento che è stato cliccato – DeRagan

+0

Sì, ma come ricreare la finestra di dialogo in quell'evento –

5

Sono stato alle prese con questo per un bel po 'di tempo. Mantengo una matrice dello stato "controllato" di ciascuno degli elementi e cambio quel valore mentre cambio visivamente il valore setItemChecked. Quindi, quando si fa clic sul pulsante eseguito, si scorre iterato con "checked" per salvare i valori sul mio db.

builder.setMultiChoiceItems(cats, checked, new DialogInterface.OnMultiChoiceClickListener() { 
     public void onClick(DialogInterface dialog, int item, boolean check) { 
      if(cats[item].equals("All Categories")) { 
       AlertDialog d = (AlertDialog) dialog; 
       ListView v = d.getListView(); 
       int i = 0; 
       while(i < cats.length) { 
        v.setItemChecked(i, check); 
        checked[i] = check; 
        i++; 
       } 
      } 
      checked[item] = check; 
     } 
    }); 
Problemi correlati