AlertDialog с флажком В android
Я новичок в Android. Я работаю над приложением, в котором мне нужно показать диалог, в котором пользователь может выбрать более одного элемента. Для этого я хочу добавить флажок к каждому элементу в диалоговом окне.
Я читаю следующие сообщения в StackOverflow:
Как добавить флажок в диалоговое окно предупреждения и
Диалоговое окно Android Checkbox (Easy)
В одном из этих сообщений описывается, как создать XML, определяющий флажок в дополнение к раздуванию диалога, но я не мог заставить его работать.
Ответы
Ответ 1
Добавление флажка в AlertDialog хорошо объяснено в блоге с примером AlertDialog с CheckBox в Android
Вы можете посетить блог AlertDialog с CheckBox в Android для более подробной информации, а ниже взято из того же блога
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();
Ответ 2
Ответ может быть лучше! второй аргумент в alerBuilder.setMultiChoiceItems()
представляет собой логический массив, используемый для идентификации проверенных элементов перед отображением диалога и определения отмеченных элементов после нажатия кнопки "Положительная кнопка", поэтому код может выглядеть следующим образом:
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();
Ответ 3
Если вы хотите добавить CheckBox
со значком в AlertDialog
, вы можете настроить его как
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
модель
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;
}
}
Наконец,
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();
}
Демо на Github