我已经成功地实现了一个自定义对话框,当用户试图通过后退按钮或使用onBackPressed()离开一个活动时,该对话框就会出现。他们可以简单地取消对话框或继续,然后离开活动。这个功能已经在多个活动中实现了,但是它使我的代码比它需要的要长很多。我想知道如何创建一个可以在不同的活动中引用的工具,而不需要多次复制粘贴这段代码。请注意,我是从string.xml中获取对话框的标题和描述。
这是我的代码。
Dialog customDialog;
Button button_one, button_two;
TextView dialog_title, dialog_description;
customDialog = new Dialog(this);
//Back button will close app
@Override
public void onBackPressed() {
customDialog.setContentView(R.layout.custom_dialog_box);
dialog_title = customDialog.findViewById(R.id.dialog_title);
dialog_title.setText(getString(R.string.leaving_activity_warning_title));
dialog_description = customDialog.findViewById(R.id.dialog_description); dialog_description.setText(getString(R.string.leaving_activity_warning_description));
button_one = customDialog.findViewById(R.id.button_one);
button_one.setText(getString(R.string.cancel));
button_two = customDialog.findViewById(R.id.button_two);
button_two.setText(getString(R.string.leave_anyway));
button_one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
customDialog.dismiss();
}
});
button_two.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
customDialog.dismiss();
finish();
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
}
});
Objects.requireNonNull(customDialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
customDialog.show();
}
UPDATE
DialogBoxMessage代码。
class DialogBoxMessage {
private Dialog customDialog;
private TextView dialog_title, dialog_description;
private Button button_one, button_two;
//Custom Dialog Box Initialization
DialogBoxMessage(Button myButtonOne, TextView myDialogTitle, TextView myDialogDescription, Dialog myCustomDialog) {
customDialog = myCustomDialog;
button_one = myButtonOne;
button_two = myButtonOne;
dialog_title = myDialogTitle;
dialog_description = myDialogDescription;
}
void leaveActivity() {
customDialog.setContentView(R.layout.custom_dialog_box);
dialog_title = customDialog.findViewById(R.id.dialog_title);
dialog_title.setText(Resources.getSystem().getString(R.string.leaving_activity_warning_title));
dialog_description = customDialog.findViewById(R.id.dialog_description);
dialog_description.setText(Resources.getSystem().getString(R.string.leaving_activity_warning_description));
button_one = customDialog.findViewById(R.id.button_one);
button_one.setText(Resources.getSystem().getString(R.string.cancel));
button_two = customDialog.findViewById(R.id.button_two);
button_two.setText(Resources.getSystem().getString(R.string.leave_anyway));
button_one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
customDialog.dismiss();
}
});
button_two.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
customDialog.dismiss();
}
});
Objects.requireNonNull(customDialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
customDialog.show();
}
}
其他活动代码。
//Reusable exit dialog message
DialogBoxMessage dialogBoxMessage;
//Back button will close app
@Override
public void onBackPressed() {
dialogBoxMessage.leaveActivity();
finish();
}
但似乎没有工作,我认为有很多问题......请帮助:(
我想 customDialog
是你写的一个单独的类--因此我建议你在初始化Dialog时,将主要信息如contentview,title,message或type放在构造函数中。对于你的onClick方法,我建议你在你的Dialog中创建一个接口来处理按钮点击。customDialog
类中的静态方法。
这可以作为一个实用工具类中的静态方法来实现。该方法需要'this'作为参数,其中包含活动上下文。该方法应该返回按钮按下的结果。活动可以使用这个响应来决定是否应该调用finish()。
更新
我曾建议使用简单的静态方法,但你走了面向对象的路线。然而,你的构造函数需要传入多个视图,这似乎无法实现你所追求的代码效率。 dialogBoxMessage = new DialogBoxMessage(this);
才能调用该对象的任何方法。