Как создать утилиту, на которую можно ссылаться несколько раз в разных действиях - PullRequest
0 голосов
/ 28 апреля 2020

Я успешно реализовал пользовательское диалоговое окно, которое появляется, когда пользователь пытается покинуть занятие с помощью кнопки назад или с помощью onBackPressed (). Они могут просто отменить диалоговое окно или продолжить и покинуть действие. Эта функция была реализована в нескольких действиях, однако она делает мой код намного длиннее, чем нужно. Я хотел знать, как создать утилиту, на которую можно ссылаться в различных действиях, без необходимости вставлять фрагмент кода, вставленный несколько раз. Обратите внимание, что я извлекаю заголовок и описание диалога из строки. 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();

  }
}
Я ввожу следующий код в другой активности

Код другой активности:

//Reusable exit dialog message
DialogBoxMessage dialogBoxMessage;


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

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

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Это может быть реализовано как метод stati c в классе утилит. Метод будет требовать «this» в качестве параметра, который содержит контекст действия. Метод должен вернуть результат нажатия кнопки. Упражнение может использовать этот ответ, чтобы определить, следует ли вызывать fini sh () или нет.

ОБНОВЛЕНИЕ

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

0 голосов
/ 28 апреля 2020

Полагаю, customDialog - это отдельный класс, который вы написали, поэтому я бы посоветовал вам добавить основную информацию, такую ​​как contentview, title, message или type, в конструктор при инициализации ur Dialog. Для вашего метода onClick я предлагаю вам создать интерфейс для обработки нажатий кнопок в вашем классе customDialog.

...