2012-03-19 21 views
27

Attualmente quando l'utente apre la mia app uno AlertDialog apre chiedendo loro se vorrebbero effettuare l'aggiornamento alla versione pro. Devo aggiungere uno CheckBox allo AlertDialog per fare in modo che l'app non mostri più AlertDialog quando l'utente apre l'app.Come aggiungere una casella di spunta a una finestra di avviso

Ecco quello che ho per il AlertDialog ora:

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

Se qualcuno potesse mostrare come aggiungere un CheckBox al AlertDialog che renderà l'applicazione non mostrano più il AlertDialog quando l'utente apre l'app , sarebbe grandioso. Grazie in anticipo!

risposta

71

È necessario utilizzare il metodo setView(View) sull'oggetto AlertDialog.Builder. Ciò inserirà il passaggio tra View tra l'area del messaggio e i pulsanti. Basta gonfiare un View con un CheckBox e passare che in Ecco un esempio:.

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> 

codice nel tuo attività

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

Penso che sia necessario eseguire il cast della vista restituita da findViewById a un CheckBox. Ottima risposta altrimenti. – Gallal

+0

@Gallal Hai ragione. Ho fatto quella correzione. –

+1

Cerca di evitare l'uso di testo lungo con il layout di esempio xml, la casella di controllo sarà nascosta se il tuo testo è troppo lungo – xDragonZ

1

Per prima cosa è necessario definire un layout che contenga il messaggio e la casella di controllo per disabilitare l'avviso nelle viste successive. Poi invece di chiamare builder.setMessage, si chiama:

builder.setView(myAlertViewWithDisablingCheckbox); 

Poi, quando l'utente fa clic sul pulsante finestra di avviso, si dovrà controllare per vedere se che la casella è stato controllato, e salvare tale preferenza nella vostra app SharedPreferences. Quindi è possibile utilizzare tale preferenza per determinare se questa finestra di avviso deve essere nuovamente visualizzata all'utente.

0

È possibile utilizzare un multichoicelist con una sola voce :

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

Quindi nel OnClick() di un pulsante di dialogo avviso è possibile controllare il valore di checked[0] e salvare il valore nel del Sharedpreferences vostra applicazione:

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 questa preferenza è possibile decidere se la finestra di dialogo dovrebbe essere ancora una volta mostrato in futuro.

Problemi correlati