有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何创建可在不同活动中多次引用的util

我已经成功实现了一个自定义对话框,当用户试图通过后退按钮或使用onBackPressed()离开某个活动时,该对话框会出现。他们可以简单地取消对话框或继续,然后离开活动。这个函数已经在多个活动中实现,但是它使我的代码比需要的长很多。我想知道如何创建一个可以在不同活动中引用的util,而不需要将代码块复制粘贴多次。请注意,我正在从字符串中检索对话框标题和说明。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();

}

更新

  1. 创建了一个名为“DialogBoxMessage”的Java文件

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

  }
}
  1. 我在另一个活动中输入以下代码

其他活动代码:

//Reusable exit dialog message
DialogBoxMessage dialogBoxMessage;


//Back button will close app
@Override
public void onBackPressed() {
  dialogBoxMessage.leaveActivity();
  finish();
}

但它似乎不起作用,我认为有很多问题。。。请帮助:(


共 (2) 个答案

  1. # 1 楼答案

    这可以在实用程序类中作为静态方法实现。该方法需要将“this”作为参数,该参数包含活动上下文。该方法应返回按钮按下的结果。活动可以使用此响应来确定是否应调用finish()

    更新

    我提出了一个简单的静态方法,但你已经走上了面向对象的道路。没关系。 但是,构造函数需要传入多个视图,这似乎无法达到您所追求的代码效率。 构造器应该只需要活动上下文;其他所有内容都封装在新类中。 在每个活动的onBackPressed方法中,您需要使用 dialogBoxMessage = new DialogBoxMessage(this); 然后才能调用该对象的任何方法

  2. # 2 楼答案

    我假设customDialog是您编写的一个单独的类,因此我建议您在初始化您的对话框时,将contentview、标题、消息或类型等主要信息放入构造函数中。 对于onClick方法,我建议您创建一个界面来处理应用程序中的按钮点击 customDialog