2012-03-19 11 views
27

Actualmente, cuando el usuario abre mi aplicación, se abre un AlertDialog preguntándoles si desean actualizar a la versión pro. Necesito agregar un CheckBox al AlertDialog que hará que la aplicación ya no muestre el AlertDialog cuando el usuario abra la aplicación.Cómo agregar una casilla de verificación a un cuadro de diálogo de alerta

Esto es lo que tengo para el AlertDialog ahora:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle(" MY_TEXT"); 
    builder.setMessage(" MY_TEXT ") 
      .setCancelable(false) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        Uri uri = Uri.parse("market://details?id=MY_APP_PACKAGE"); 
        Intent intent = new Intent (Intent.ACTION_VIEW, uri); 
        startActivity(intent);       } 
      }) 
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }).show(); 

Si alguien me podría mostrar cómo agregar un CheckBox a la AlertDialog que hará que la aplicación ya no muestran la AlertDialog cuando el usuario abre la aplicación , eso seria genial. ¡Gracias de antemano!

Respuesta

71

Tiene que utilizar el método setView(View) en el objeto AlertDialog.Builder. Esto colocará el aprobado en View entre el área de mensajes y los botones. Simplemente inflar un View con un CheckBox y pasar de que en He aquí un ejemplo:.

checkbox.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

    <CheckBox 
     android:id="@+id/checkbox" 
     style="?android:attr/textAppearanceMedium" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="5dp" /> 

</FrameLayout> 

Código en su actividad

View checkBoxView = View.inflate(this, R.layout.checkbox, null); 
CheckBox checkBox = (CheckBox) checkBoxView.findViewById(R.id.checkbox); 
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

     // Save to shared preferences 
    } 
}); 
checkBox.setText("Text to the right of the check box."); 

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle(" MY_TEXT"); 
    builder.setMessage(" MY_TEXT ") 
      .setView(checkBoxView) 
      .setCancelable(false) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        Uri uri = Uri.parse("market://details?id=MY_APP_PACKAGE"); 
        Intent intent = new Intent (Intent.ACTION_VIEW, uri); 
        startActivity(intent);       } 
      }) 
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }).show(); 
+2

Creo que necesita convertir la vista devuelta por findViewById a un CheckBox. Gran respuesta de lo contrario. – Gallal

+0

@Gallal Tienes razón. Hice esa corrección. –

+1

Trate de evitar el uso de texto largo con la muestra xml layut, la casilla de verificación se ocultará si su texto es demasiado largo – xDragonZ

1

Primero debe definir un diseño que contenga el mensaje y la casilla de verificación para deshabilitar la alerta en vistas posteriores. A continuación, en lugar de llamar builder.setMessage, se le llama:

builder.setView(myAlertViewWithDisablingCheckbox); 

Luego, cuando el usuario hace clic en el botón de diálogo de alerta, usted tiene que comprobar para ver si esa casilla se ha comprobado, y guardar esa preferencia en su aplicación de SharedPreferences. Luego puede usar esa preferencia para determinar si este diálogo de alerta debe mostrarse nuevamente al usuario.

0

Se puede usar un multichoicelist con sólo un elemento :

final boolean checked = new boolean {false}; 
builder.setMultiChoiceItems(new String[]{"Remember decision}, checked, new DialogInterface.OnMultiChoiceClickListener() { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i, boolean b) { 
        checked[i] = b; 
       } 
      }); 

Luego en el OnClick() de un botón de diálogo de alerta se puede comprobar el valor de checked[0] y guardar ese valor en Sharedpreferences de su aplicación:

builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 
         if(checked[0]){ 
          SharedPreferences.Editor editor = settings.edit(); 
          editor.putBoolean("preferences_never_buy_pro", true); 
          editor.apply(); 
         } 
         dialog.cancel(); 

        } 
       }); 

Con esta preferencia puede decidir si el cuadro de diálogo debe aparecer de nuevo en el futuro.

Cuestiones relacionadas