Немного о чистом коде

118
08 июня 2019, 23:50

Приветсвую, есть у меня в коде класс ConfirmDialog, цель которого при нажатии кнопки Продолжить, выполнить действие, а при нажатии отмена, убрать диалог.

Вот код

/*
 * Created by k1ceargy on 30.11.18 (macOS 10.12)
 * */
public class ConfirmDialog {
        static Dialog dialog;
        public static void showDialog(final Context context, String msg, View.OnTouchListener onTouchListener) {
            dialog = new Dialog(context);
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setCancelable(false);
            dialog.setContentView(R.layout.activity_dialog);
            TextView text = (TextView) dialog.findViewById(R.id.text_dialog);
            final Button dialogButton = (Button) dialog.findViewById(R.id.btn_continue);
            final Button cancelButton = (Button) dialog.findViewById(R.id.cancel_button);
            text.setText(msg);
            dialogButton.setOnTouchListener(onTouchListener);
            cancelButton.setVisibility(View.VISIBLE);
            cancelButton.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            v.getBackground().setColorFilter(context.getResources().getColor(R.color.dark_yellow), PorterDuff.Mode.SRC_ATOP);
                            v.invalidate();
                            break;
                        case MotionEvent.ACTION_UP:
                            v.getBackground().clearColorFilter();
                            v.invalidate();
                            dialog.dismiss();
                            break;
                    }
                    return false;
                }
            });
            dialog.show();
        }
}

работает это так:

ConfirmDialog.showDialog(this, "Вы действительно хотите что-то сделать?", (сюда передается OnTouchListener на кнопку Продолжить (dialogButton)));

Так вот, у меня есть CheckBox в другом классе, и чтобы вставить в него галочку необходимо запросить подтверждение, ну а если нажата кнопка отмены необходимо вернуть исходное значение CheckBox. Вопрос в том, как это сделать, если на кнопку отмены не повлиять.

Если вешать 2 TouchListener то это уже хардкод. Поэтому и название такое.

Answer 1

вы что то много всего напутали. В Диалоге должно быть всего 2 кнопки (в вашем случае) ОК и ОТМЕНА, в случае отмены я так понимаю вам вообще делать ничего не нужно, оставляйте CheckBox в том состоянии в котором он есть.

Почитайте что такое делегаты и как с ними работать

в данном примере:
Создайте интерфейс например IConfrimDialog

interface IConfrimDialog {
    void onDialogConfirmClick();
    void onDialogCancelClick();
}

в метод showDialog вместо OnTouchListener передавайте ваш IConfrimDialog. Методы IConfrimDialog вызывайте в OnTouchListener (который создавайте в методе showDialog)

Реализуйте (создавайте) анонимный класс IConfrimDialog, там где сейчас создаёте OnTouchListener

profit

ну и еще, если вам нужно только менять CheckBox то почему бы его и не передать в ваш showDialog

Answer 2

Я бы предложил убрать листенер и сделать так чтобы метод возвращал значение (boolean или кастомный енум).

public static DialogResult showDialog(final Context context, String msg)
enum DialogResult { OK, CANCEL }

Использовать так:

DialogResult r = showDialog(context, "");
if(r == DialogResult.OK) {
   // тут код для случая если пользователь нажал OK
} else {
   // а тут если нажал Cancel
}
READ ALSO
Анимация планет солнечной системы

Анимация планет солнечной системы

У меня есть картинка планет солнечной системы

162
Как исправить ошибку: Failed to execute 'appendChild' on 'Node'

Как исправить ошибку: Failed to execute 'appendChild' on 'Node'

При выполнении appendChild появляется следующая ошибка

144
Как связать скрипт нажатия кнопки и скрипт работы с содержимым страницы в расширении Google Chrome

Как связать скрипт нажатия кнопки и скрипт работы с содержимым страницы в расширении Google Chrome

Сделал расширение, при клике на его иконку всплывает pop-up с кнопкой при нажатии на которую, открываются все ссылки на странице с определенным...

145
Ошибка 500 при выполнении запроса /wd/hub/sessions к docker-selenium

Ошибка 500 при выполнении запроса /wd/hub/sessions к docker-selenium

Запускаем Selenium-сервер (elgalu/docker-selenium):

122