使用自定义对话框时无法使用onDismiss() - Android

时间:2011-02-06 22:30:43

标签: android dialog custom-controls

我正在开发一个小程序,我需要添加一个自定义对话框,在关闭时将一些信息传递给调用的活动。 我扩展了对话框类,当我尝试在关闭时捕获自定义对话框时,使用onDismiss侦听器,它永远不会到达它,因为我使用了自定义对话框。

这是我活动的一部分 -

    .
    .
    .
       attributes customizeDialog = new attributes(con,position,pick.getLastVisiblePosition());
        customizeDialog.show();

(属性是扩展对话框类的类的名称)。

这是我在对话框完成时设置的事件监听器 -

    customizeDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {

        @Override
        public void onDismiss(DialogInterface dialog) {
            Log.v("LOG_CAT",attributes.selectedIndexes.get(0) + " " + attributes.selectedIndexes.get(1) + " " + attributes.selectedIndexes.get(2) + " " + attributes.selectedIndexes.get(3) + " " + attributes.selectedIndexes.get(5) + " ");
    }

});

我知道我做错了,我只是不知道如何解决它。

我真的很感激这个问题的任何帮助。

谢谢!

6 个答案:

答案 0 :(得分:16)

我倾向于让我的活动实现这样的听众......

public class MyActivity extends Activity
    implements DialogInterface.OnDismissListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        attributes customizeDialog = new attributes(con,position,pick.getLastVisiblePosition());
        customizeDialog.setOnDismissListener(this);
        customizeDialog.show();
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        // Do whatever
    }
}

答案 1 :(得分:5)

您可以让您的调用活动实现在对话框关闭时调用的自定义侦听器接口:

public interface MyDialogListener {
    void OnCloseDialog();
}

public class MyActivity implements MyDialogListener {
    public void SomeMethod() {
        MyDialog myDialog = new MyDialog(this, this);
        myDialog.show();
    }

    public void OnCloseDialog() {
        // Do whatever you want to do on close here
    }

}

public class MyDialog extends Dialog {
    MyDialogListener mListener;

    public MyDialog (Context context, MyDialogListener listener) {
        super(context, R.style.Dialog);
        mListener = listener;
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.CloseButton:
                mListener.OnCloseDialog();
                dismiss()
                break;
            default:
                //...
        }
    }
}

如果您想在解雇之外的任何其他时间将内容发送回呼叫者,这将非常有用。

答案 2 :(得分:1)

如果您希望在对话框中进行某种保存,则必须再次使用onDicmissListener,因为默认情况下不会调用自定义对话框onDismiss

public class CustomDialog extends Dialog implements DialogInterface.OnDismissListener {

    public CustomDialog(Context context) {
        super(context);
        setupLayout(context);
    }

    public CustomDialog(Context context, int theme) {
        super(context, theme);
        setupLayout(context);
    }

    protected CustomDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
        setupLayout(context);
    }

    private void setupLayout(Context context) {
        this.context = context;
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.custom_dialog);
        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.width = WindowManager.LayoutParams.FILL_PARENT;
        getWindow().setAttributes(params);

        setOnDismissListener(this);

        loadPreferences();
    }

    private void loadPreferences() {
      // ...
    }

    private void savePreferences() {
       // ...
    }

    @Override
    public void onDismiss(DialogInterface dialogInterface) {
        savePreferences();
    }
}

答案 3 :(得分:1)

如果您正在使用自定义对话框而无法关闭它,请尝试以下代码。 它对我有用。

 new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
           dialog.dismiss();
        }
    }, 1500);

答案 4 :(得分:0)

要记住的一件事是OnDismissListener正在监听子进程的解雇。客户对话框的父级需要onDismissListener,而不是对话框本身。

“用于在对话框解除时允许对话框的创建者运行某些代码的接口。”

答案 5 :(得分:0)

在CustomDialog类中添加对话框:

public class MessageBoxDialog extends Dialog implements DialogInterface.OnDismissListener
{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
         ...
         setOnDismissListener(this);
         ...
    }

    @Override
    public void onDismiss(DialogInterface dialogInterface) {

    }
}