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

时间:2010-04-08 03:20:56

标签: android alertdialog

我有一个简单的列表视图,在警告对话框中有一些复选框。我需要选择添加select all / none,但是你不能在警告对话框中显示菜单,我想从一个按钮执行此功能。从我所看到的任何一种按钮(正面,中性和负面)都可以关闭对话框。

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

5 个答案:

答案 0 :(得分:6)

  

那么,这可能吗?

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

  

如果不是,我有哪些替代方案?

以下是一些:

  1. 不提供全选/无
  2. 请勿使用AlertDialog,而是使用以对话为主题的活动
  3. 请勿使用AlertDialog,而是使用Dialog
  4. 的其他子类
  5. 您引用的选项(不要使用setAdapter(),而是为对话框内容创建自己的View
  6. 根本不要使用Dialog,而是ListActivity通过startActivityForResult()启动(类似于#2,只是不用担心主题)

答案 1 :(得分:5)

您必须覆盖按钮的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
        * 
        */

    }
});

答案 2 :(得分:0)

  

那么,这可能吗?

您可以尝试使用以下方法将自定义视图放在AlertDialog上:

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

该视图可以包含您的按钮。只需将onClickListener附加到可与列表视图一起使用的按钮。

答案 3 :(得分:0)

您是否尝试过扩展AlertDialog类并让它实现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.
        }
    }
}

按照此模板,您可以放置​​所需的任何按钮,并在对话框中创建自己的功能。您也可以在运行时创建自己的Button,但是您必须完成配置按钮的文本,大小,图标等的额外工作。

然后,您可以在onCreateDialog()调用下的活动中创建对话框。

protected Dialog onCreateDialog( int id ) {
    MyDialog dialog = new MyDialog( this, 0 );
    dialog.setOnCancelListener( this );
    dialog.setOnDismissListener( this );
    return dialog;
}

希望这有帮助。

答案 4 :(得分:0)

有可能。解决方案是

  1. dismiss方法改为不执行任何操作。这将阻止在单击任何按钮时对话框被忽略。或者,您也可以保存原始解雇。

  2. 修改OnClickListener,使其在对话框中调用超类(即 AlertDialog )的dismiss()(即super.dismiss())单击所需的按钮。

  3. 我通常将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;
            }
        }
    
    }
    

    这样只有在单击NEGATIVE或POSITIVE按钮时才会关闭对话框,但是当按钮NEUTRAL为时,会保持显示对话框。