是否可以在AlertDialog上创建一个不会自动关闭对话框的按钮?

问题描述:

我有一个简单的列表视图,在警报对话框中有一些复选框。我需要选择添加一个选择全部/无,但你不能在一个警告对话框中调出菜单,我想从一个按钮做这个功能。从我看到的任何一种按钮(正面,中立和负面)都可以关闭对话框。是否可以在AlertDialog上创建一个不会自动关闭对话框的按钮?

那么,这是可能的吗?如果不是,我有什么替代方案?我最后的缓解措施是简单地创建一个新视图并重新创建所有内容。是新的看法最好的解决方案?

所以,这可能吗?

不是来自AlertDialog,AFAIK的标准按钮。

如果不是,我有什么替代方案?

这里有一些:

  1. 不提供选择所有/无
  2. 不要使用AlertDialog,但用一个对话框主题活动
  3. 不要使用AlertDialog,但使用Dialog的其他子类
  4. 您引用的选项(请勿使用setAdapter(),而应为对话内容创建您自己的View
  5. 不要使用Dialog可言,但ListActivity通过startActivityForResult()开始(类似于#2,只是不用担心主题)
+0

谢谢你的答复和众多的选择:) – Parker 2010-04-08 14:42:57

+0

选项4.效果很好。您可以在该自定义布局中定义一个'ListView',并将您自己的适配器附加到它。使用[CWAC'MergeAdapater'](https://github.com/commonsguy/cwac-merge)在选项组之间使用组标题的积分: – ohhorob 2011-05-19 18:58:45

那么,这可能吗?

您可以尝试使用下面的方法,将您的自定义视图上AlertDialog:

android.app.AlertDialog.Builder.setView(View view) 

这种观点可以包含您的按钮。只需将onClickListener附加到可以在列表视图中操作的按钮即可。

+0

您知道如何为按钮创建漂亮的外观布局吗AlertDialog? – 2012-10-10 05:19:58

+0

@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 
     * 
     */ 

    } 
}); 
+0

你击败了256k – user457015 2013-02-02 15:46:42

+0

尼斯解决方案,m4n3k4s。谢谢。 :) – BruceHill 2013-03-05 18:23:29

这是可能的。解决的办法是

  1. 重写dismiss方法无能为力。这将防止点击任何按钮时对话框被解除。或者,您还可以保存原始解雇。

  2. 修改你的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时显示。

+0

你还需要你的对话框变成点击监听器的地方 – njzk2 2014-02-27 15:51:39