Как создать утилиту, на которую можно ссылаться несколько раз в разных действиях

Я успешно реализовал пользовательское диалоговое окно, которое появляется, когда пользователь пытается выйти из действия с помощью кнопки «Назад» или с помощью 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();

}

ОБНОВИТЬ

  1. Создал файл Java с именем "DialogBoxMessage"

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

Но это не работает, я думаю, что есть много проблем... пожалуйста, помогите :(


person Joe    schedule 28.04.2020    source источник


Ответы (2)


Я предполагаю, что customDialog - это отдельный класс, который вы написали, поэтому я предлагаю вам поместить основную информацию, такую ​​​​как содержимое, заголовок, сообщение или тип, в конструктор при инициализации вашего диалога. Для вашего метода onClick я предлагаю вам создать интерфейс для обработки нажатий кнопок в вашем классе customDialog.

person jksevend    schedule 28.04.2020
comment
Так что на самом деле customDialog не является отдельным классом. Пожалуйста, посмотрите обновление, ваша помощь будет оценена по достоинству. - person Joe; 29.04.2020
comment
Вы получаете какие-либо ошибки при попытке вызвать метод leaveActivity()? - person jksevend; 29.04.2020
comment
Насколько я понимаю вашу проблему, так это то, что у вас есть диалоговое окно шаблона, которое пытается получить пользовательский ввод о том, хочет ли пользователь оставить эту конкретную активность, которую показывает диалоговое окно, верно? В противном случае ответ, который дал @codebod, также кажется довольно чистым решением. Я нашел несколько ссылок, которые могут быть вам полезны: [ссылка] (stackoverflow.com/questions/38194234/). Обратите внимание, что в этих примерах используется класс AlertDialog. ссылка - person jksevend; 29.04.2020

Это может быть реализовано как статический метод в классе утилит. Метод потребует «это» в качестве параметра, который содержит контекст действия. Метод должен возвращать результат нажатия кнопки. Активность может использовать этот ответ, чтобы определить, следует ли вызывать finish() или нет.

ОБНОВИТЬ

Я предложил простой статический метод, но вы выбрали объектно-ориентированный путь. Это нормально. Однако ваш конструктор требует передачи нескольких представлений, что, по-видимому, не обеспечивает требуемой эффективности кода. Ваш конструктор должен просто требовать контекст Activity; все остальное инкапсулировано в вашем новом классе. В каждом методе onBackPressed Activity вам нужно будет создать объект с помощью dialogBoxMessage = new DialogBoxMessage(this);, прежде чем вы сможете вызывать любой из методов этого объекта.

person codebod    schedule 28.04.2020
comment
Я в определенной степени понимаю, как это сделать, не могли бы вы предоставить код, который поможет мне немного лучше понять? - person Joe; 28.04.2020
comment
В собственном классе утилит создайте метод с сигнатурой public static bool reusableExitDialog (контекст контекста). Разместите здесь свой код. В каждом действии в onBackPressed(...) вызовите if(!Utilities.reusableExitDialog(this)) finish();. - person codebod; 28.04.2020