Пользовательский диалог с setMultiChoiceItems

Я хочу создать способ, которым пользователи могут выбирать такие параметры, как изображение ниже

Введите описание изображения здесь

Сейчас я делаю следующее

public static class CategoriesDialogFragment extends SherlockDialogFragment { public static CategoriesDialogFragment newInstance(int title) { CategoriesDialogFragment frag = new CategoriesDialogFragment(); Bundle args = new Bundle(); args.putInt("title", title); frag.setArguments(args); return frag; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { int title = getArguments().getInt("title"); return new AlertDialog.Builder(getActivity()) .setIcon(R.drawable.alert_dialog_icon) .setTitle(title) .setMultiChoiceItems(_categories, _selections, new DialogSelectionClickHandler()) .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { ((MainActivity) getActivity()) .doPositiveClick(); } }).create(); /* * .setNegativeButton(R.string.alert_dialog_cancel, new * DialogInterface.OnClickListener() { public void * onClick(DialogInterface dialog, int whichButton) { * ((MainActivity) getActivity()) .doNegativeClick(); } }) */ } public class DialogSelectionClickHandler implements DialogInterface.OnMultiChoiceClickListener { public void onClick(DialogInterface dialog, int clicked, boolean selected) { // Log.i("ME", _options[clicked] + " selected: " + selected); } } } 

Но я хочу добавить ВСЕ вариант, как изображение. Поэтому я думаю, что мне придется создавать пользовательский диалог. Могу ли я расширить родные setMultiChoiceItems, чтобы он уменьшил мою обработку кода.

Solutions Collecting From Web of "Пользовательский диалог с setMultiChoiceItems"

Вероятно, вы можете использовать метод setCustomTitle() класса AlertDialog.Builder и AlertDialog.Builder свой собственный заголовок, который имеет текст заголовка, а также весь CheckBox , примерно так:

 new AlertDialog.Builder(getActivity()) .setIcon(R.drawable.alert_dialog_icon) .setTitle(title) .setCustomTitle(getLayoutInflater().inflate(R.layout.custom_title, null)); 

Где R.layout.custom_title :

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView1" style="?android:attr/textAppearanceLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Dialog title" android:textColor="#ffffff" /> <TextView android:id="@+id/all" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="All" android:textColor="#ffffff" /> <CheckBox android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

Необходимо сделать другие настройки стиля, чтобы они выглядели лучше. Но, увидев весь диалог, вы можете захотеть пойти с пользовательским классом Dialog , для которого метод setMultiChoice() не будет доступен (но в конце он будет легко реплицироваться).

Я достиг того, что вы показываете на изображении. То, что я использовал, был Custom Dialogue, как вы думаете, чтобы использовать. Я использовал Listview внутри xml-файла.

Прежде всего Define инициализирует нижестоящий класс.

 // Catagory Selection public static ArrayList<String> acceptpositionwhoesNearMe = new ArrayList<String>(); public static String AcceptCatagotyIDWhoesNearMe = ""; 

Ниже приведен код showDialog (), который я использовал.

 public void showDialog() { Log.i(TAG, "Inside Show Dialog"); final Dialog warning = new Dialog(logout_dialogue.this); warning.requestWindowFeature(Window.FEATURE_NO_TITLE); warning.setContentView(R.layout.YOUR_XML); warning.setCancelable(false); warning.getWindow().setGravity(Gravity.CENTER); WindowManager mWinMgr; mWinMgr = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); int displayWidth = mWinMgr.getDefaultDisplay().getWidth(); warning.getWindow().setLayout(displayWidth - 75, LayoutParams.WRAP_CONTENT); warning.setOnDismissListener(new OnDismissListener() { public void onDismiss(DialogInterface dialog) { Log.i(TAG, "Inside Dialog interface"); // test = true; warning.dismiss(); } }); ListView listinterest = (ListView) warning .findViewById(R.id.list_catagory); /* * ArrayList<String> count = new ArrayList<String>(); count.clear(); * count.add("Hotels"); count.add("Restaurants"); count.add("Gardens"); * count.add("Theater"); */ CatagorySummaryAdapter adapter; adapter = new CatagorySummaryAdapter(YOUR_ACTIVITY.this, YOUR_ARRAYLIST_OF_CATAGORY, true); listinterest.setAdapter(adapter); Button btnOk = (Button) warning.findViewById(R.id.btn_close); btnOk.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String Catagory = ""; int count = HomeActivity.acceptpositionwhoesNearMe.size(); if (count > 0) { for (int i = 0; i < HomeActivity.acceptpositionwhoesNearMe .size(); i++) { int pos = Integer .parseInt(HomeActivity.acceptpositionwhoesNearMe .get(i)); if (Catagory.equals("")) { Catagory = GetUserDetailsJsonParser.CategoryName .get(pos); HomeActivity.AcceptCatagotyIDWhoesNearMe = GetUserDetailsJsonParser.CategoryID .get(pos); } else { Catagory = Catagory + "," + GetUserDetailsJsonParser.CategoryName .get(pos); HomeActivity.AcceptCatagotyIDWhoesNearMe = HomeActivity.AcceptCatagotyIDWhoesNearMe + "," + GetUserDetailsJsonParser.CategoryID .get(pos); } } Log.i(TAG, "Accept Catagory IDs WhoseNear Me" + HomeActivity.AcceptCatagotyIDWhoesNearMe); GetUserDetailsJsonParser.InterestedIn = HomeActivity.AcceptCatagotyIDWhoesNearMe; UpdateMap = true; /* * startActivity(new Intent(WhosNearMe.this, * BuildInukshk_4.class)); */ new GetUsersInRadiusAsyncTask().execute(); warning.dismiss(); } else { Toast.makeText(WhosNearMe.this, "Please Select One or More Catagory", 3).show(); } // test = true; } }); warning.show(); } 

Вот мой logout_dialogue.xml :

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/edittext_back_final" android:orientation="vertical" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <com.inukshk.CustomTextViewBold android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:text="Interested in" android:textColor="#3C3C3C" android:textSize="18sp" android:textStyle="bold" /> </LinearLayout> <ListView android:id="@+id/list_catagory" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:layout_weight="1" android:cacheColorHint="#00000000" android:divider="@android:color/transparent" > </ListView> <Button android:id="@+id/btn_close" android:layout_width="99dp" android:layout_height="40dp" android:layout_alignParentLeft="true" android:layout_marginLeft="10dp" android:background="@drawable/btn_back_final" android:text="CLOSE" android:textColor="#ffffff" android:textSize="16dp" android:textStyle="bold" /> </LinearLayout> </LinearLayout> 

Здесь My CatagorySummaryAdapter.java :

 package com.inukshk.adapter; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.RelativeLayout; import android.widget.TextView; import com.inukshk.HomeActivity; import com.inukshk.R; import com.inukshk.CreateInukshk.BuildInukshk_3; import com.inukshk.WhosNearMe.WhosNearMe; public class CatagorySummaryAdapter extends BaseAdapter { public Activity context; String TAG = "CatagorySummaryAdapter"; public LayoutInflater inflater; public ArrayList<String> Count; boolean Dialogue; public CatagorySummaryAdapter(Activity context, ArrayList<String> Count, boolean Dialogue) { super(); this.context = context; this.inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.Count = Count; this.Dialogue = Dialogue; // TODO Auto-generated constructor stub } @Override public int getCount() { // TODO Auto-generated method stub return Count.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return Count.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public int getItemViewType(int position) { // TODO Auto-generated method stub return position; } public class ViewHolder { RelativeLayout lsummary_row; TextView txtinterestname; CheckBox chkinterest; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub int pos = position; ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); if (Dialogue) { convertView = inflater.inflate( R.layout.listview_summary_dialogue_row, null); } else { convertView = inflater.inflate(R.layout.listview_summary_row, null); } holder.txtinterestname = (TextView) convertView .findViewById(R.id.txtinterestname); holder.lsummary_row = (RelativeLayout) convertView .findViewById(R.id.lsummary_row); holder.chkinterest = (CheckBox) convertView .findViewById(R.id.chkinterest); holder.chkinterest.setEnabled(true); holder.chkinterest.setTag(position); if (Dialogue) { for (int i = 0; i < HomeActivity.acceptpositionwhoesNearMe.size(); i++) { int index = Integer .parseInt(HomeActivity.acceptpositionwhoesNearMe .get(i)); // Log.i(TAG, "Inside for Loop of Accept Positions"); if (index == position) { // Log.i(TAG, "Matched for index" + index); holder.chkinterest.setChecked(true); holder.chkinterest .setButtonDrawable(R.drawable.checkbox_checked); } } } else { for (int i = 0; i < BuildInukshk_3.acceptposition.size(); i++) { int index = Integer.parseInt(BuildInukshk_3.acceptposition .get(i)); // Log.i(TAG, "Inside for Loop of Accept Positions"); if (index == position) { // Log.i(TAG, "Matched for index" + index); holder.chkinterest.setChecked(true); holder.chkinterest .setButtonDrawable(R.drawable.checkbox_checked); } } } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.chkinterest .setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub // Log.i(TAG, "ISChecked is " + isChecked); if (isChecked) { // Log.i(TAG, "ISChecked is true"); buttonView .setButtonDrawable(R.drawable.checkbox_checked); int position = Integer.parseInt(buttonView.getTag() .toString()); if (Dialogue) { HomeActivity.acceptpositionwhoesNearMe.add(String .valueOf(position)); Log.i(TAG, "Accept ID of Dialogue" + HomeActivity.acceptpositionwhoesNearMe); } else { BuildInukshk_3.acceptposition.add(String .valueOf(position)); Log.i(TAG, "Accept ID" + BuildInukshk_3.acceptposition); } } else { // Log.i(TAG, "ISChecked is false"); buttonView .setButtonDrawable(R.drawable.checkbox_unchecked); int position = Integer.parseInt(buttonView.getTag() .toString()); if (Dialogue) { if (HomeActivity.acceptpositionwhoesNearMe .contains(String.valueOf(position))) { // Log.i(TAG, // "Inside Already present position"); HomeActivity.acceptpositionwhoesNearMe .remove(String.valueOf(position)); Log.i(TAG, "Accept ID Dialogue***" + HomeActivity.acceptpositionwhoesNearMe); } } else { if (BuildInukshk_3.acceptposition .contains(String.valueOf(position))) { // Log.i(TAG, // "Inside Already present position"); BuildInukshk_3.acceptposition.remove(String .valueOf(position)); Log.i(TAG, "Accept ID ***" + BuildInukshk_3.acceptposition); } } // } } }); holder.txtinterestname.setText(Count.get(pos)); return convertView; } } 

Попытаться пройти через это может помочь вам.

Я также хотел использовать setMultiChoiceItems() своем диалоговом окне, поэтому вместо создания настраиваемого диалога я сделал следующее:

Не возвращайте AlertDialog немедленно. Создайте AlertDialog.Builder сначала так:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

Задайте параметры вашего застройщика:

 builder.setTitle(listTitle) .setMultiChoiceItems(allTagsArray, containsTag, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked){ 

Затем создайте сам AlertDialog , вызывающий create() . Это пока не покажет диалог.

AlertDialog dialog = builder.create();

Затем получите ListView , добавьте заголовок и / или нижний колонтитул и верните его.

 ListView dialogList = dialog.getListView(); dialogList.addFooterView(yourHeader); return dialog; 

Это также работает с setKustomTitle setCustomTitle() @) Luksprog, предоставляя вам в общей сложности три настраиваемых пространства без необходимости внедрять пользовательский адаптер. Единственным возможным препятствием для этого является то, что верхние и нижние колонтитулы прокручиваются вместе со списком (что является проблематичным, если список длиннее экрана, очевидно).

Надеюсь это поможет.

Важное обновление : не используйте заголовки в списке флажков. Это заставляет AlertController.java какой флажок отмечен, делая его бесполезным. Нижний колонтитул все еще можно использовать, что полезно в этом случае, но не в моем случае, поэтому я создаю настраиваемый диалог.