2013-06-06 22 views
36

Jestem nowy na Androida. Pracuję nad aplikacją, w której muszę wyświetlić okno dialogowe, w którym użytkownik może wybrać więcej niż jeden przedmiot. W tym celu chcę dodać pole wyboru do każdego elementu w oknie dialogowym.AlertDialog z polem wyboru W Androidzie

czytam poniższe posty na StackOverflow:

How to add a check box to an alert dialog i

Android Checkbox Dialog (Easy)

Jednym z tych stanowisk opisać jak stworzyć XML definiowania wyboru oprócz pompowania okno, ale nie mogłem dostać to działa.

+2

masz niestandardowe okno dialogowe, w którym trzeba wiązać jeden xml grzywny w którym pole – CoronaPintu

+0

Co tam jest stworzenie wyjątek, przed którym stoisz? –

+0

Wpisz kod i błąd (jeśli występuje). Również @Pritu Corna ma rację. Użyj niestandardowego okna dialogowego. –

Odpowiedz

67

Dodawanie wyboru w AlertDialog jest dobrze wyjaśnione w blogu z przykładuAlertDialog With CheckBox In Android

Możesz odwiedzić blogAlertDialog With CheckBox In Androidwięcej szczegółów, a następnego pochodzi z tego samego bloga

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

Działa tylko, jeśli NIE masz setMessage – gregoiregentil

12

Odpowiedź może być lepiej! Drugi argument w alerBuilder.setMultiChoiceItems() jest logiczna tablica używany do identyfikacji sprawdzonych elementów przed pokazaniem okna i zidentyfikować sprawdzonych elementów po Pozytywna kliknięciu przycisku więc kod może być tak:

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

Jeśli chcesz dodać CheckBox z ikoną do AlertDialog można zwyczaj to podoba

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 modelu

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

Wreszcie

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

Powiązane problemy