用setMultiChoiceItems自定义对话框

我想创build一个用户可以select像下面的图像的选项的方式

在这里输入图像说明

现在我正在做下面的事情

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

但是我想添加像图像的所有选项。 所以我想我将不得不build立一个自定义的对话框。 我仍然可以扩展本地setMultiChoiceItems,以便减less我对代码的处理。

Solutions Collecting From Web of "用setMultiChoiceItems自定义对话框"

您可能可以使用AlertDialog.Builder类的setCustomTitle()方法,并构build您自己的标题,其中包含标题文本以及所有 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)。 我已经在xml文件中使用了ListView。

首先定义初始化下面的数组列表。

 // 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> 

这里是我的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()与我的对话框,所以而不是创build一个自定义对话框,我这样做:

不要立即返回AlertDialog 。 首先创buildAlertDialog.Builder ,如下所示:

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

设置你的构build器参数:

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

然后创buildAlertDialog本身,调用create() 。 这不会显示对话框。

AlertDialog dialog = builder.create();

然后获得ListView ,添加一个页眉和/或页脚,并返回它。

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

这也适用于@ Luksprog的setCustomTitle()给你总共三个可定制的空间,而不必实现一个自定义的适配器。 这对于一些可能的唯一可能的缺点是页眉和页脚与列表一起滚动(显然,如果列表比屏幕长,这只是有问题的)。

希望这可以帮助。

重要更新 :不要在checkbox列表中使用标题。 它会导致AlertController.java错误地计算选中的checkbox,使其无效。 页脚仍然可以使用,在这种情况下是有用的,但在我的情况下,所以我正在构build一个自定义对话框。