2010-08-31 16 views
12

Hola,casillas de verificación Conmutación de elección múltiple en AlertDialog androide

he creado el elección múltiple AlertDialog El AlertDialog tiene cinco elementos de la lista con casillas de verificación. Cuando yo marque la primera casilla de verificación, si esta es si se marcan las otras casillas en la lista , se desactivarán automáticamente y viceversa.

estoy comprobando el estado de IsChecked en el método deonClick del OnMultiChoiceClickListener() y llamar a la showDialog (DIALOG_MULTIPLE_CHOICE); al actualizar boolean [] checkedItems; para recrear el Diálogo , pero no puedo lograrlo. Si tiene alguna sugerencia, por favor diríjase al de manera correcta.

¿Hay alguna manera de recrear el evento AleartDialog onClick del clic de botón de radio?

un código de ejemplo a continuación:

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(); 

Saludos Vinayak

+0

¿Quiso decir utilizar un RadioButton? ¿Cuáles son todos los atributos? ¿Por qué no publicas parte del código para eliminar algunas de las conjeturas? – jacknad

+0

HI JackN, he actualizado la Pregunta con el código, que puede hacer que sea más claro –

Respuesta

19

No vuelva a crear el cuadro de diálogo, solo active las casillas de verificación dentro del cuadro de diálogo actual. Your onMultiChoiceClickListener puede realizar un seguimiento de la casilla actualmente activa (si corresponde) y desmarcarla cuando se selecciona otra. Esto es un ejemplo de trabajo probado completo:

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 a tener en cuenta: se debe especificar "nulo" para el parámetro "checkedItems" en su llamada "setMultiChoiceItems" - de lo contrario el "setItemChecked" llamadas no lo hará trabajar como se espera Terminaría usando esa matriz para almacenar el estado verificado, y "setItemChecked" no lo actualizaría correctamente, por lo que todo se confundiría. Extraño, pero cierto.

2

¿Usted intentó reemplazar setMultiChoiceItems-setSingleChoiceItems en su diálogo?

+0

Entonces no habría manera de alternar las casillas de verificación ... Quiero opción múltiple en que esta función de alternancia (checkbogs list1 está marcada y luego List2, list3.list4, list5 debe estar desmarcado y si alguna de las 2,3,4 o 5 está marcada, la casilla list1 checkub shub estará desmarcada) –

+0

También tenga en cuenta cómo se hace clic en la posición del botón.Compruebe el parámetro llamado "whichbutton" que le debe dar la posición del elemento que se ha hecho clic en – DeRagan

+0

Sí, pero cómo recrear el diálogo en ese evento –

5

Estuve luchando con esto por bastante tiempo. Mantengo una matriz del estado "verificado" de cada uno de los elementos y cambio ese valor mientras cambio visualmente el valor de setItemChecked. Luego, cuando se hace clic en el botón "done", recorro "checked" para guardar los valores en mi 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; 
     } 
    }); 
Cuestiones relacionadas