[英]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.