2010-06-22 4 views
3

J'essaie d'utiliser un dialogue sélectionnable multiple comme le code ci-dessous. Et je veux utiliser un bouton neutre pour désélectionner tous les éléments de la liste. Mais lorsque vous cliquez sur un bouton quel qu'il soit sur la boîte de dialogue, la boîte de dialogue disparaît immédiatement, je suppose qu'il doit s'agir d'une action par défaut. Mais je veux le garder car un utilisateur ne s'attend pas à ce que cette action me plaise. Est-il possible d'éviter de faire disparaître un dialogue en cliquant sur un bouton, ou devrais-je créer un dialogue personnalisé?Comment éviter de masquer (ou de rejeter) un AlertDialog en cliquant sur un NeutralButton?

protected Dialog onCreateDialog(int index) 
{ 
    return new AlertDialog.Builder(this) 
      .setTitle("title") 
      .setMultiChoiceItems(items, selections, new DialogInterface.OnMultiChoiceClickListener(){ 
       @Override 
       public void onClick(DialogInterface dialog, int clicked, boolean selected) { }  
      })  
      .setPositiveButton("OK", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int id) 
       { 
        //Do something 
       } 
      }) 
      .setNeutralButton("Deselect all", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int id) 
       { 
        //Do something 
       } 
      }) 
      .create(); 
} 

Merci à l'avance, yokyo

Répondre

3

J'ai réussi à sélectionner/désélectionner tous les éléments selon l'approche suivante. L'idée vient du conseil de Rpond, merci Rpond!

- /res/layout/dialog_footer.xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/footerRoot" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"> 
<Button  android:id="@+id/selectAllButton" 
    android:text="@string/select_all" 
    style="@style/FooterButton" /> 
</LinearLayout> 

- code ici

protected Dialog onCreateDialog(int index) 
{ 
    AlertDialog builder= new AlertDialog.Builder(this) 
      .setTitle("title") 
      .setMultiChoiceItems(items, selections, new DialogInterface.OnMultiChoiceClickListener(){ 
       @Override 
       public void onClick(DialogInterface dialog, int clicked, boolean selected) { }  
      })  
      .create(); 

LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); 
View layout = inflater.inflate(R.layout.dialog_footer, (ViewGroup)findViewById(R.id.footerRoot)); 

    Button selectAllButton = (Button)layout.findViewById(R.id.selectAllButton); 
    selectAllButton.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View arg0) { 
      Log.v("Test", "hello"); 
     }   
    });  

    builder.setView(layout); 
    return builder; 
} 

Il fonctionne exactement ce que je veux. yokyo

2

Vous pourriez être mieux créer une boîte de dialogue personnalisée. Vous pouvez utiliser n'importe quelle activité et définir le thème de l'activité sur Theme.Dialog. I.e., dans votre manifeste:

<activity android:theme="@android:style/Theme.Dialog"> 
+0

Merci Mayra, je vais creuser cette approche. –

3

Si vous ajoutez un bouton en utilisant une de ces méthodes de la boîte de dialogue setButton rejettera après que le gestionnaire exécute. Donc vous avez deux options. Créez votre propre boîte de dialogue et faites fonctionner le bouton comme vous le souhaitez. Ou deux, Puisque vous utilisez une liste, vous pouvez appeler getListView sur AlertDialog et appeler addFooterView avec un bouton. Cette solution peut sembler étrange avec les autres boutons.

+0

Merci Rpond. Vous m'avez assuré qu'il n'y a pas de moyen normal d'éviter ce comportement. Je vais jeter un oeil à la création d'une approche de dialogue personnalisé. –

Questions connexes