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
试图创建一个通用函数来执行自定义对话框,运行 遇到了从自身关闭对话框的问题,这是我在 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