簡體   English   中英

如何在Android中完成后將onclick事件傳遞給方法以關閉對話框

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

嘗試創建一個通用函數來執行自定義對話框,遇到了從自身關閉對話框的問題,這是我在活動中的代碼。 我正在嘗試完成對話而不是活動。 我也無法從調用類中引用 alertDialog 來執行 .dismiss() 。 有任何想法嗎? 是的,從技術上講,每次我想顯示此彈出窗口時,我都可以使用 showPopupMessage 並輕松地在其中執行 onclick。 我正在嘗試制作一個通用的應用程序,我只是在方法之外設置 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;

然后我在通用類中的代碼,

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();
}

您應該通過擴展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);
    }
}

在您的活動中,調用對話框並響應按鈕單擊,如下所示:

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

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

您需要重做很多事情, Dialog.show()並不意味着程序會手動調用它。 您應該使用DialogFragment和FragmentManager來管理對話框的顯示,隱藏等。

如果您不遵循DialogFragment路線,那么以后您將面臨很多麻煩,直到您意識到必須使用它。

使用AlertDialog setPositiveButton()方法為YES,使用setNegativeButton()方法為否,並處理其點擊

顯示對話框后設置onClickListener無效嗎?

  alertDialog.show();

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

對於科特林:

文件:自定義對話框

class AlertDialogFragment(
private val clickCancelListener: () -> Unit,
private val clickConfirmListener: () -> Unit

) : DialogFragment() {
private lateinit var bindingDialog: CustomDialogFragmentBinding

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    bindingDialog = CustomDialogFragmentBinding.inflate(LayoutInflater.from(context))
    return activity?.let {
        val builder = AlertDialog.Builder(it)
        clickOnBtnCancel()
        clickOnBtnConfirm()
        builder.setView(bindingDialog.root).create()
    } ?: throw IllegalStateException("Activity cannot be null")
}

fun clickOnBtnCancel() {
    bindingDialog.btnCancel.setOnClickListener {
        clickCancelListener()
        dismiss()
    }
}

fun clickOnBtnConfirm() {
    bindingDialog.btnConfirm.setOnClickListener {
        clickConfirmListener()
    }
}

文件:來自呼叫自定義的活動

private fun onClickConfirm(){
    Toast.makeText(applicationContext, "¡¡Click on confirm button!!", 
    Toast.LENGTH_SHORT).show()
}
private fun onClickCancel(){
    Toast.makeText(this, "¡¡Click on cancel button!!", Toast.LENGTH_SHORT).show()
}


private fun displayCustomAlertDialog(){
    binding.btnSendList.setOnClickListener {
        val alert = AlertDialogFragment({ onClickCancel()},{onClickConfirm()})
        alert.isCancelable = false
        alert.show(supportFragmentManager, "CustomAlert")
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM