Android 确定单击时触发的AlertDialog(DialogInterface dialog,int which)
我正在创建一个对话框,如下所示:Android 确定单击时触发的AlertDialog(DialogInterface dialog,int which),android,events,dialog,onclick,identify,Android,Events,Dialog,Onclick,Identify,我正在创建一个对话框,如下所示: @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_1: return new AlertDialog.Builder(this) .setTitle(R.string.s_dlg1) .setPositiveButton(android.R.string.ok, this) .create(); case DIALO
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_1:
return new AlertDialog.Builder(this)
.setTitle(R.string.s_dlg1)
.setPositiveButton(android.R.string.ok, this)
.create();
case DIALOG_2:
...
...
}
return null;
}
@Override
public void onClick(DialogInterface dialog, int whichButton) {
if (dialog == ???) {
...
}
else if (dialog == ???){
...
}
}
如何识别哪个对话框触发了onClick方法?在创建对话框时,我不能将接口方法声明为串联,因为我想访问类中的变量。其他每个接口都会向其方法传递某种id,以确定哪个对象调用了该方法,但我似乎无法使用“DialogInterface dialog”执行任何操作。也许您可以将onclick侦听器提取为一个单独的类,然后传入对话框id?界面是android.content.DialogInterface.OnClickListener这对我有用
case Dialog_import_database:
return new AlertDialog.Builder(Main.this)
.setTitle(R.string.ImportDatabaseDialogTitle)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Log.i("Main","positive Button In dialog Box");
当点击这里的“积极”按钮时,你想付什么
}
})
.setNegativeButton("Cancel", null)
.setMessage(R.string.ImportDatabaseMessage)
.create();
}
难二是直接识别哪个对话框有 而不是显示按下了哪个按钮,所以如果你用不同的按钮填充对话框,你就可以做到这一点。 大概是这样的:
new AlertDialog.Builder(this)
.setTitle(R.string.s_dlg1)
.setPositiveButton(android.R.string.ok, this)
.create();
new AlertDialog.Builder(this)
.setTitle(R.string.s_dlg2)
.setNegativeButton(android.R.string.ok, this)
.create();
@Override
public void onClick(DialogInterface dialog, int whichButton) {
if (whichbutton == DialogInterface.BUTTON_POSITIVE) {
...
}
else if (whichButton == DialogInterface.BUTTON_NEGATIVE){
...
}
这个问题已经很老了,到目前为止还没有答案,所以我找到了一个解决这个问题的方法 在我启动的这个活动中,根据用户的操作,有可能触发2个不同的自定义
对话框片段。让我们把它们称为DialogFragment
A
或B
。我们使用标准生成器创建这些标签,然后.show(fragmentManager,)
其中标签可以是A_标签
或B_标签
,以便以后轻松识别它们
因此,如果显示其中一个DialogFragment
,您将需要决定在已实现的onClick(DialogInterface dialog,int buttonclick)
中执行什么操作,下面是我的操作方法:
final DialogFragment aDialogInterface = (DialogFragment) getSupportFragmentManager().findFragmentByTag(A_TAG);
final DialogFragment bDialogInterface = (DialogFragment) getSupportFragmentManager().findFragmentByTag(B_TAG);
if (aDialogInterface != null) {
//do something for dialogfragment A
} else if (bDialogInterface != null) {
//do something for dialogfragment B
}
基本上,在findFragmentByTag(…)
…上执行空检查时,我遇到了相同的问题。现在我找到了以下解决方案
private Dialog[] aaa = new Dialog[2];
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_1:
aaa[0] = new AlertDialog.Builder(this)
.setTitle(R.string.s_dlg1)
.setPositiveButton(android.R.string.ok, this)
.create();
retrun aaa[0];
case DIALOG_2:
...
...
}
return null;
}
@Override
public void onClick(DialogInterface dialog, int whichButton) {
if (dialog == aaa[0])) {
...
}
else if (dialog == aaa[1]){
...
}
}
这是一个老问题,但我仍然遇到了相同的问题xO。
作为一种解决方法,我使用了Dialog对象的“hashCode”。
根据对话框类型,您可以将“对话框接口”强制转换为特定类型,并将“第一个”和“第二个”对话框的“hashCode”与回调函数中“DilaogInterface”对象的“hasscode”进行比较
public void onClick(DialogInterface dialog,int whichButton){}
函数签名。这相当于将其存储在当前类的私有变量中,因为一次只能显示一个对话框,并且在用户可以启动另一个对话框并更改值之前,onClick将触发。这就是我现在正在做的,但它是不干净的。我在同一活动中使用多个DatePickerDialog时遇到了相同的问题。似乎没有一种简单的方法可以识别是哪一个触发了onDateSet事件。我不知道有什么更好的方法,如果你想识别对话框,你必须将id存储在某个地方,现在对话框不包含“标记”或id,所以你必须在接收识别对话框的变量的类中实现onclick,扩展对话框类本身并添加id,或者在调用片段或活动中保存变量并使用getContext获取它们。另一种方法(不确定是否有效)是使用dialogFragment并向其添加标记,这样您就可以获得标记并识别所使用的对话框。我不相信没有更好的解决方案。我回到这里,如果我喜欢一些东西…如果你像这样声明它,你就不能访问类变量。这段代码放在带有switch语句的ondialogcreate metode中,然后你只需调用showdialog(Dialog\u import\u database)@Matt Gibson无法从内联onClick方法访问类变量。@Kurian尝试时会出现什么错误?你能公布你的密码吗?我可能被你的术语弄糊涂了,但是,例如,这段代码目前在我的工作应用程序中:builder.setNeutralButton(“C”,new DialogInterface.OnClickListener(){@Override public void onClick(DialogInterface dialog,int which){mSelectedRun=getNextRunNumber();showRunClock();}
其中mSelectedRun是我的活动类的成员。@MattGibson我无法访问mSelectedRun,除非它是一个静态变量。