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,除非它是一个静态变量。