Android 如何将 onclick 事件传递到完成后关闭对话框的方法

How to pass a onclick event into a method to dismiss dialog after completion in Android

试图创建一个通用函数来执行自定义对话框,运行 遇到了从自身关闭对话框的问题,这是我在 activity 中的代码。我正在尝试完成对话,但未完成 activity。我也无法通过调用 class 引用 alertDialog 来执行 .dismiss()。有任何想法吗?是的,从技术上讲,每次我想显示此弹出窗口并在其中轻松执行 onclick 时,我都可以使用 showPopupMessage。我正在尝试制作一个通用的应用程序,我只是在方法外部设置 onclicklistener 并将其传入。

 case R.id.deleteText:
                            final Context context = this;
                            View.OnClickListener rightEvent = new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    deleteCard(btCardToken);
                                    finish();
                                }
                            };
                            showPopupMessage(context,"Company", "Are you sure you wish to delete this card?", "CANCEL", "YES", rightEvent);
                            break;

然后我的通用代码 class,

public void showPopupMessage(Context context, String header, String message, String leftButtonText, String rightButtonText, View.OnClickListener rightEvent)
{
    LayoutInflater inflator = LayoutInflater.from(context);
    View promptsView = inflator.inflate(R.layout.edit_text_prompt, null);

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);

    // set prompts.xml to alertdialog builder
    alertDialogBuilder.setView(promptsView);

    final StyledTextView alertHeader = (StyledTextView)promptsView.findViewById(R.id.alertHeader);
    final StyledTextView alertText = (StyledTextView)promptsView.findViewById(R.id.alertText);
    final StyledTextView rightButton = (StyledTextView)promptsView.findViewById(R.id.rightButton);
    final StyledTextView leftButton = (StyledTextView)promptsView.findViewById(R.id.leftButton);
    final EditText inputEditTextBox = (EditText)promptsView.findViewById(R.id.inputEditTextBox);

    alertHeader.setText(header);
    alertText.setText(message);
    inputEditTextBox.setVisibility(View.GONE);
    leftButton.setText(leftButtonText);
    rightButton.setText(rightButtonText);

    // set dialog message
    alertDialogBuilder.setCancelable(true);

    // create alert dialog
    final AlertDialog alertDialog = alertDialogBuilder.create();
    leftButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            alertDialog.dismiss();
        }
    });
    rightButton.setOnClickListener(rightEvent);
    alertDialog.show();
}

http://developer.android.com/guide/topics/ui/dialogs.html

你需要返工很多东西,Dialog.show()并不是要你的程序手动调用。您应该使用 DialogFragment 和 FragmentManager 来管理对话框的显示、隐藏等。

如果你不遵循 DialogFragment 路线,你以后会遇到很多很多的麻烦,直到你意识到你必须使用它。

对 YES 使用 AlertDialog setPositiveButton() 方法,对 NO 使用 setNegativeButton() 方法并处理他们的点击

是否在显示对话框后设置 onClickListener 不起作用?

  alertDialog.show();

  leftButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        alertDialog.dismiss();
    }
});
rightButton.setOnClickListener(rightEvent);

您应该通过扩展 DialogFragment 并在 onCreateDialog() 回调方法中创建一个 AlertDialog 来创建一个对话框。要传递对话框点击,请为每种类型的点击事件定义一个接口和一个方法。然后在将从对话框接收操作事件的主机组件中实现该接口。

您的对话框可能如下所示:

public class MyDialog extends DialogFragment {

    // Use this instance of the interface to deliver action events
    MyDialogListener mListener;

    // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        // Verify that the host activity implements the callback interface
        try {
            // Instantiate the MyDialogListener so we can send events to the host
            mListener = (MyDialogListener) activity;
        } catch (ClassCastException e) {
            // The activity doesn't implement the interface, throw exception
            throw new ClassCastException(activity.toString() + " must implement MyDialogListener");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Build the dialog and set up the button click handlers
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // Get the layout inflater
        LayoutInflater inflater = getActivity().getLayoutInflater();
        builder.setView(inflater.inflate(R.layout.edit_text_prompt, null))
        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        final StyledTextView alertHeader = (StyledTextView) promptsView.findViewById(R.id.alertHeader);
        final StyledTextView alertText = (StyledTextView) promptsView.findViewById(R.id.alertText);
        final StyledTextView rightButton = (StyledTextView) promptsView.findViewById(R.id.rightButton);
        final StyledTextView leftButton = (StyledTextView) promptsView.findViewById(R.id.leftButton);
        final EditText inputEditTextBox = (EditText) promptsView.findViewById(R.id.inputEditTextBox);

        alertHeader.setText(header);
        alertText.setText(message);
        inputEditTextBox.setVisibility(View.GONE);
        leftButton.setText(leftButtonText);
        rightButton.setText(rightButtonText);

        // set dialog message
        builder.setCancelable(true);
        leftButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onLeftClicked(MyDialog.this);
            }
        });
        rightButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onRightClicked(MyDialog.this);
            }
        });
        return builder.create();
    }

    /* The activity that creates an instance of this dialog fragment must
     * implement this interface in order to receive event callbacks.
     * Each method passes the DialogFragment in case the host needs to query it. */
    public interface MyDialogListener {
        public void onLeftClicked(DialogFragment dialog);
        public void onRightClicked(DialogFragment dialog);
    }
}

在您的 activity 中,像这样调用对话框并响应按钮点击,

public class MainActivity extends FragmentActivity
                          implements MyDialog.MyDialogListener{
    ...

    public void showMyDialog() {
        // Create an instance of the dialog fragment and show it
        DialogFragment dialog = new MyDialog();
        dialog.show(getSupportFragmentManager(), "MyDialog");
    }

    // The dialog fragment receives a reference to this Activity through the
    // Fragment.onAttach() callback, which it uses to call the following methods
    // defined by the MyDialog.MyDialogListener interface
    @Override
    public void OnLeftClicked(DialogFragment dialog) {
        // User touched the dialog's left button
        ...
    }

    @Override
    public void onRightClicked(DialogFragment dialog) {
        // User touched the dialog's right button
        ...
    }
}

更多信息你可以查看官方文档:http://developer.android.com/guide/topics/ui/dialogs.html