Diálogo personalizado con setMultiChoiceItems

Quiero crear una forma en que los usuarios pueden seleccionar opciones como la imagen a continuación

Introduzca aquí la descripción de la imagen

Ahora estoy haciendo lo siguiente

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

Pero quiero agregar TODA la opción como la imagen. Así que creo que tendré que construir un cuadro de diálogo personalizado. ¿Puedo extender el nativo setMultiChoiceItems para que reduzca mi manejo del código.

Probablemente podría utilizar el método setCustomTitle() de la clase AlertDialog.Builder y construir su propio título que tiene el texto del título y también el CheckBox , algo así:

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

Donde R.layout.custom_title es:

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

Otros ajustes de estilo se deben hacer para que se vea mejor. Pero al ver todo el diseño del diálogo, es posible que desee ir con una clase de Dialog personalizada, para la que el método setMultiChoice() no estará disponible (pero al final será fácil de replicar).

He logrado lo que estás mostrando en la imagen. Lo que he utilizado fue Custom Dialogue como usted está pensando en usar. Había utilizado Listview dentro del archivo xml.

Primero defina inicializar el arraylist siguiente.

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

A continuación se muestra el código showDialog () que he usado.

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

Aquí está Mi 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> 

Aquí está Mi 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; } } 

Tratar de pasar por ella podría ayudarle.

También quería seguir usando setMultiChoiceItems() con mi diálogo, así que en lugar de crear un diálogo personalizado, hice esto:

No devuelva el AlertDialog inmediatamente. Cree el AlertDialog.Builder primero como esto:

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

Establezca los parámetros del constructor:

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

A continuación, cree el propio AlertDialog llamando a create() . Esto no mostrará el diálogo todavía.

AlertDialog dialog = builder.create();

A continuación, obtenga el ListView , agregue un encabezado y / o pie de página y devuélvalo.

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

Esto también funciona con setCustomTitle() @ Luksprog, dándole un total de tres espacios personalizables sin tener que implementar un adaptador personalizado. El único inconveniente posible de esto para algunos es que los encabezados y pies de página se desplazan con la lista (que es sólo problemático si la lista es más larga que la pantalla, obviamente).

Espero que esto ayude.

Actualización importante : no utilice encabezados en una lista de casilla de verificación. Provoca que AlertController.java erróneamente qué casilla de verificación está marcada, haciendo que sea inútil. Todavía se puede utilizar un pie de página, que es útil en este caso, pero no en mi caso, por lo que estoy creando un diálogo personalizado.

  • Diálogo de alerta personalizado
  • ¿Cuál es la diferencia entre Dialog.setContentView (View) & AlertDialog.setView (View)
  • ¿Cómo puedo crear botones positivos y negativos en diálogos personalizados?
  • ¿Cómo puedo mostrar solo un cuadro de diálogo a la vez?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.