Избежать одновременного срабатывания OnDismissListener и onClick

257
11 января 2017, 00:38

Этот вопрос является развитием темы Java: обойти необходимость невозможного изменения значения локальной переменной извне. Из ответов на вопрос я понял, что суть проблемы не та, котрую я изначально предположил, и она заслуживает отдельного вопроса.

Повторю задачу. У нас есть FloatingActionButton; при нажатии которого появляется диалоговое окно (или popupWindow, не суть важно), а при повторном нажатии - исчезает. Также окно должно исчезнуть при нажатии в любом месте вне окна.

private void initFAB(){
    fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        LayoutInflater layoutInflater = (LayoutInflater) getBaseContext()
                .getSystemService(LAYOUT_INFLATER_SERVICE);
        View popupWindowContent = layoutInflater.inflate(R.layout.popup_window_content, null);
        final PopupWindow popupWindow = new PopupWindow(popupWindowContent,
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        popupWindow.setOutsideTouchable(true);
        if (fab.getTag().toString().equals("0")){
            rotateFabForward();
            View.OnClickListener onClickListener = new View.OnClickListener() {
                public void onClick(View view) {
                    //...
                }
            };
            // ...
            popupWindow.showAtLocation(fab, Gravity.END | Gravity.BOTTOM, 50, 400);
            fab.setTag("1"); // visible state
        }
        else{
            rotateFabBackward();
            popupWindow.dismiss();
            fab.setTag("0"); // hidden state
        }
    }
});
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
        @Override
        public void onDismiss() {
            rotateFabBackward();
            fab.setTag("0");                   
        }
    });
}

Если закрывать окно только касанием вне окна, но без кнопки, то всё будет нормально. При нажатии же на кнопку с целью закрыть окно срабатывают два события: Dismiss и Click. Одновременно они срабатывают, или последовательно, не знаю, но так или иначе, OnDismissListener заканчивает выполнение раньше и мы приходим в onClick с нулевым тагом и в else не попадаем.

Что-нибудь можно сделать? Может есть аналог stopPropagation из JavaScript?

Answer 1

Попробуйте воспользоваться AlertDialog'ом c лиснерами для каждой кнопки и отдельным слушателем для всего диалога(setOnDismissListener), если я правильно понял вашу проблему.

    AlertDialog.Builder b = new AlertDialog.Builder(context);
    b.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    b.setPositiveButton("OK",new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    b.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {
        }
    });
READ ALSO
Потеря фокуса окон в Swing

Потеря фокуса окон в Swing

Есть приложениеИнтерфейс реализован на Swing

274
Что лучше для создания игры на Android? [требует правки]

Что лучше для создания игры на Android? [требует правки]

Какую среду разработки/движок и технологии посоветуете?

223
JAXB как игнорировать поля суперкласса?

JAXB как игнорировать поля суперкласса?

Здравствуйте, уважаемые

280
Как делать чтоб при свернутом состоянии телефон определял место положение?

Как делать чтоб при свернутом состоянии телефон определял место положение?

Всем привет!Есть приложение которое отправляет данные на удаленную БД MySQLВсе было прекрасно пока не начал тестировать в реальном времени...

314