是否可以在AlertDialog上创建一个不会自动关闭对话框的按钮?
我有一个简单的列表视图,在警报对话框中有一些复选框。我需要选择添加一个选择全部/无,但你不能在一个警告对话框中调出菜单,我想从一个按钮做这个功能。从我看到的任何一种按钮(正面,中立和负面)都可以关闭对话框。是否可以在AlertDialog上创建一个不会自动关闭对话框的按钮?
那么,这是可能的吗?如果不是,我有什么替代方案?我最后的缓解措施是简单地创建一个新视图并重新创建所有内容。是新的看法最好的解决方案?
所以,这可能吗?
不是来自AlertDialog
,AFAIK的标准按钮。
如果不是,我有什么替代方案?
这里有一些:
- 不提供选择所有/无
- 不要使用
AlertDialog
,但用一个对话框主题活动 - 不要使用
AlertDialog
,但使用Dialog
的其他子类 - 您引用的选项(请勿使用
setAdapter()
,而应为对话内容创建您自己的View
) - 不要使用
Dialog
可言,但ListActivity
通过startActivityForResult()
开始(类似于#2,只是不用担心主题)
那么,这可能吗?
您可以尝试使用下面的方法,将您的自定义视图上AlertDialog:
android.app.AlertDialog.Builder.setView(View view)
这种观点可以包含您的按钮。只需将onClickListener附加到可以在列表视图中操作的按钮即可。
您知道如何为按钮创建漂亮的外观布局吗AlertDialog? – 2012-10-10 05:19:58
@Vu安和:请针对您的问题提出一个单独的SO问题,提供您想要实现的具体细节。 – 2012-10-10 07:56:00
你试过扩展AlertDialog类,并把它implment OnCLickListener
public class MyDialog extends AlertDialog implements OnClickListener {
private Button myButton;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// use LayoutInflater to get at custom button
LayoutInflater layoutInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View contentView = layoutInflater.inflate(R.layout.mydialog_layout, null);
// pull button from layout, set listener
myButton = (Button)contentView.findViewById(R.id.myButtonId);
myButton.setOnClickListener(this);
setContentView(contentView);
}
public void onClick(View v) {
if (v.getId() == R.id.myButtonId) {
// DO your button actions.
}
}
}
按照这个模板,你可以把你需要的任何按钮,在对话框内建立自己的功能。你也可以在运行时创建你自己的按钮,但是你必须做额外的工作来配置按钮的文本,大小,图标等。
然后你可以在你的活动中的onCreateDialog()呼叫。
protected Dialog onCreateDialog(int id) {
MyDialog dialog = new MyDialog(this, 0);
dialog.setOnCancelListener(this);
dialog.setOnDismissListener(this);
return dialog;
}
希望这会有所帮助。
您必须覆盖按钮的onClickListener。例如对于中性按钮,您将拥有类似如下的东西:
AlertDialog dialog = builder.create();
dialog.setButton(AlertDialog.BUTTON_NEUTRAL, "Neutral", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.setButton(AlertDialog.BUTTON_POSITIVE, "Positive", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
Button neutralButton = dialog.getButton(DialogInterface.BUTTON_NEUTRAL);
neutralButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View onClick) {
/**
*
* your code
*
*/
}
});
你击败了256k – user457015 2013-02-02 15:46:42
尼斯解决方案,m4n3k4s。谢谢。 :) – BruceHill 2013-03-05 18:23:29
这是可能的。解决的办法是
重写
dismiss
方法无能为力。这将防止点击任何按钮时对话框被解除。或者,您还可以保存原始解雇。修改你的OnClickListener以便它调用超你的对话框的(即AlertDialog)的解雇()(即
super.dismiss()
)当您想要的按钮(S)为被点击。
我通常使Dialog类的监听器,所以我会做这样的事情
public class MyAlertDialog extends AlertDialog implements OnClickListener { // other methods @Override public void dismiss() { } // superclass's dismiss, might come in handy when the OnClickListener is not this dialog public void normalDismiss() { super.dismiss(); } public void onClick(DialogInterface dialog, int which) { switch (which) { case BUTTON_NEGATIVE: // handle your event super.dismiss(); break; case BUTTON_NEUTRAL: // handle your event break; case BUTTON_POSITIVE: default: // handle your event super.dismiss(); break; } } }
,这样只会关闭该对话框时,无论是按钮阴性或点击正面的,但保持对话在按钮NEUTRAL时显示。
你还需要你的对话框变成点击监听器的地方 – njzk2 2014-02-27 15:51:39
谢谢你的答复和众多的选择:) – Parker 2010-04-08 14:42:57
选项4.效果很好。您可以在该自定义布局中定义一个'ListView',并将您自己的适配器附加到它。使用[CWAC'MergeAdapater'](https://github.com/commonsguy/cwac-merge)在选项组之间使用组标题的积分: – ohhorob 2011-05-19 18:58:45