我想创建一种方式,用户可以选择如下图所示的选项
现在正在做以下
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,以便减少我对代码的处理。
答案 0 :(得分:10)
您可以使用AlertDialog.Builder
类的setCustomTitle()
方法构建自己的标题,其中包含标题文本以及 all 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()
方法将无法使用(但最终将很容易复制)。
答案 1 :(得分:2)
我已经实现了你在图像中显示的东西。我所使用的是您想要使用的自定义对话。我在xml文件中使用了Listview。
首先定义初始化以下的arraylist。
// 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;
}
}
尝试通过它可能会帮助你。
答案 2 :(得分:1)
我还想继续在我的对话框中使用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;
这也适用于@Lacksprog的setCustomTitle()
,总共有三个可自定义的空间,而无需实现自定义适配器。对于某些人来说,唯一可能的缺点是页眉和页脚随列表一起滚动(如果列表长于屏幕,这只会有问题。)
希望这有帮助。
重要更新:
不要在复选框列表中使用标题。它导致AlertController.java
错误计算勾选了哪个复选框,使其无效。仍然可以使用页脚,这在这种情况下很有用,但在我的情况下不行,所以我正在构建一个自定义对话框。