2013-06-06 18 views
36

Ich bin neu in Android. Ich arbeite an einer App, in der ich einen Dialog zeigen muss, in dem Benutzer mehr als einen Artikel auswählen können. Dazu möchte ich jedem Element im Dialog ein Kontrollkästchen hinzufügen.AlertDialog mit Kontrollkästchen In Android

las ich folgende Beiträge auf Stackoverflow:

How to add a check box to an alert dialog und

Android Checkbox Dialog (Easy)

Einer dieser Beiträge beschreiben, wie XML erstellen das Kontrollkästchen zusätzlich definieren, um den Dialog aufblasen, aber ich konnte nicht es funktioniert.

+2

Sie haben benutzerdefiniertes Dialogfeld zu erstellen, in dem Sie eine xml fein zu binden, in dem Kontrollkästchen gibt es – CoronaPintu

+0

was Die Ausnahme, vor der Sie stehen? –

+0

Post einige Code und Fehler (falls vorhanden). Auch @Pritus Corna hat Recht. Verwenden Sie ein benutzerdefiniertes Dialogfeld. –

Antwort

67

Checkbox in Alertdialog Hinzufügen ist in dem Blog mit Beispiel erklärtAlertDialog With CheckBox In Android

Sie den BlogAlertDialog With CheckBox In Androidfür weitere Einzelheiten besuchen können, und Folgendes wird aus dem gleichen Blog genommen

final CharSequence[] items = {" Easy "," Medium "," Hard "," Very Hard "}; 
// arraylist to keep the selected items 
final ArrayList seletedItems=new ArrayList(); 

AlertDialog dialog = new AlertDialog.Builder(this) 
.setTitle("Select The Difficulty Level") 
.setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int indexSelected, boolean isChecked) { 
     if (isChecked) { 
      // If the user checked the item, add it to the selected items 
      seletedItems.add(indexSelected); 
     } else if (seletedItems.contains(indexSelected)) { 
      // Else, if the item is already in the array, remove it 
      seletedItems.remove(Integer.valueOf(indexSelected)); 
     } 
    } 
}).setPositiveButton("OK", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int id) { 
     // Your code when user clicked on OK 
     // You can write the code to save the selected item here 
    } 
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int id) { 
     // Your code when user clicked on Cancel 
    } 
}).create(); 
dialog.show(); 
+4

Es funktioniert nur, wenn Sie keine setMessage haben – gregoiregentil

12

Die Antwort könnte besser sein! das zweite Argument in alerBuilder.setMultiChoiceItems() ist ein boolean-Array verwendet, um markierte Objekte zu identifizieren, bevor Dialog zeigt und markierte Objekte zu identifizieren, nachdem Positive Schaltfläche geklickt wird so der Code wie folgt sein könnte:

AlertDialog.Builder alerBuilder = new AlertDialog.Builder(this); 
     final DBHelper dbHelper = new DBHelper(this); 
     final List<MeasurementDevice> totalDeviceList = dbHelper.getAllDevices(); 
     String[] deviceNameArr = new String[totalDeviceList.size()]; 
     final boolean[] selectedItems = new boolean[totalDeviceList.size()]; 
     for(int i = 0 ; i < deviceNameArr.length ; i++){ 
      deviceNameArr[i] = totalDeviceList.get(i).getName(); 
      selectedItems[i] = false; 
      for(int j = 0 ; j < measurementDeviceArrayList.size() ; j++){ 
       if(measurementDeviceArrayList.get(j).getId() == totalDeviceList.get(i).getId()){ 
        selectedItems[i] = true; 
        break; 
       } 
      } 
     } 
     alerBuilder.setMultiChoiceItems(deviceNameArr,selectedItems,new DialogInterface.OnMultiChoiceClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i, boolean b) { 
       Log.e("CheckStatus",String.valueOf(b)); 
      } 
     }).setPositiveButton(R.string.ok_ww,new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int ii) { 

       for(int i = 0 ; i < selectedItems.length ; i++) 
       Log.e("Sizzz",String.valueOf(selectedItems[i])); 
      } 
     }).setCancelable(false).setTitle(R.string.add_device).create().show(); 
2

Wenn Sie CheckBox mit Symbol hinzufügen möchten zu AlertDialog können Sie benutzerdefinierte wie es

public class DialogMultipleChoiceAdapter extends BaseAdapter { 
    LayoutInflater mLayoutInflater; 
    List<Item> mItemList; 

    public DialogMultipleChoiceAdapter(Context context, List<Item> itemList) { 
     mLayoutInflater = LayoutInflater.from(context); 
     mItemList = itemList; 
    } 

    @Override 
    public int getCount() { 
     return mItemList.size(); 
    } 

    @Override 
    public Item getItem(int i) { 
     return mItemList.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return 0; 
    } 

    public List<Item> getCheckedItem() { 
     List<Item> checkedItemList = new ArrayList<>(); 
     for (Item item : mItemList) { 
      if (item.isChecked()) { 
       checkedItemList.add(item); 
      } 
     } 
     return checkedItemList; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      convertView = mLayoutInflater.inflate(R.layout.item, null); 
      holder = new ViewHolder(convertView); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     final Item item = getItem(position); 
     holder.tvTitle.setText(item.getTitle()); 
     holder.ivImage.setImageResource(item.getImageRes()); 

     holder.checkbox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       item.setChecked(!item.isChecked()); 
       updateItemState(holder, item.isChecked()); 
      } 
     }); 
     updateItemState(holder, item.isChecked()); 
     return convertView; 
    } 

    private void updateItemState(ViewHolder holder, boolean checked) { 
     holder.root.setAlpha(checked ? 1 : 0.8f); 
     holder.checkbox.setChecked(checked); 
    } 

    private static class ViewHolder { 
     View root; 
     TextView tvTitle; 
     ImageView ivImage; 
     CheckBox checkbox; 

     ViewHolder(View view) { 
      root = view; 
      tvTitle = view.findViewById(R.id.text); 
      ivImage = view.findViewById(R.id.image); 
      checkbox = view.findViewById(R.id.checkbox); 
     } 
    } 
} 

item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="5dp" 
    > 
    <ImageView 
     android:id="@+id/image" 
     android:layout_width="38dp" 
     android:layout_height="38dp" 
     android:src="@mipmap/ic_launcher" 
     /> 
    <TextView 
     android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_marginStart="8dp" 
     android:layout_toEndOf="@id/image" 
     tools:text="AA" 
     /> 
    <CheckBox 
     android:id="@+id/checkbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_centerVertical="true" 
     /> 
</RelativeLayout> 

Item Modell

class Item { 
    private String title; 
    private int imageRes; 
    private boolean checked; 

    public Item(String title, int imageRes) { 
     this.title = title; 
     this.imageRes = imageRes; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public int getImageRes() { 
     return imageRes; 
    } 

    public void setImageRes(int imageRes) { 
     this.imageRes = imageRes; 
    } 

    public boolean isChecked() { 
     return checked; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
    } 
} 

Schließlich

List<Item> itemList = new ArrayList<>(); 

public void show() { 
    if (itemList.isEmpty()) { 
     itemList.add(new Item("A", R.mipmap.ic_launcher)); 
     itemList.add(new Item("B", R.mipmap.ic_launcher)); 
     itemList.add(new Item("C", R.mipmap.ic_launcher)); 
    } 

    final DialogMultipleChoiceAdapter adapter = 
      new DialogMultipleChoiceAdapter(mContext, itemList); 

    new AlertDialog.Builder(mContext).setTitle("Select Image") 
      .setAdapter(adapter, null) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) { 
        Toast.makeText(mContext, 
          "getCheckedItem = " + adapter.getCheckedItem().size(), 
          Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) { 

       } 
      }) 
      .show(); 
} 

enter image description here Demo on Github

Verwandte Themen