Всплывающее меню накапливает вхождения (не удаляет должным образом) - PullRequest
0 голосов
/ 17 сентября 2018

У меня странная ошибка в моем приложении.У меня есть RecyclerView, содержащий элементы списка со значком для меню переполнения.См. Ниже. введите описание изображения здесь

Проблема возникает, когда я касаюсь за пределами меню (чтобы отменить его).В следующий раз, когда я выбираю меню, отображается 2 меню.Это продолжается столько раз, сколько я прохожу через движения.Увидеть ниже. введите описание изображения здесь

Я не могу понять, почему это происходит.Вот мой код для отображения меню в элементе списка ViewHolder:

final PopupMenu popupMenu = new PopupMenu(mContext, mOptionsMenu);

                mOptionsMenu.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        popupMenu.inflate(R.menu.menu_edit_delete_dq_competitor);

                        Menu menu = popupMenu.getMenu();
                        MenuItem edit = menu.findItem(R.id.edit);
                        MenuItem delete = menu.findItem(R.id.delete);
                        MenuItem dq = menu.findItem(R.id.dq);
                        MenuItem undoDq = menu.findItem(R.id.undo);

                        // change options if this competitor is DQ
                        if (competitor.getStatus() == Status.DQ) {
                            edit.setVisible(false);
                            delete.setVisible(false);
                            dq.setVisible(false);
                            undoDq.setVisible(true);
                        }
                        popupMenu.show();
                    }
                });

А вот мой код для выбора пункта меню:

      popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        FragmentManager manager = getActivity().getSupportFragmentManager();
                        switch (item.getItemId()) {
                            case R.id.edit:
                                // todo finish this
//                                Intent intent = CompetitorInMatchForm.editIntent(mContext, competitor, true);
//                                startActivity(intent);
                                break;
                            case R.id.delete:
                                CompetitorStatusInMatchDialog deleteDialog = CompetitorStatusInMatchDialog.newInstance(competitor, "delete", getAdapterPosition());
                                deleteDialog.setTargetFragment(CompsInMatchFragment.this, REQUEST_ACTION);
                                deleteDialog.show(manager, DELETE_COMP_FROM_MATCH);
                                break;
                            case R.id.dq:
                                CompetitorStatusInMatchDialog dqDialog = CompetitorStatusInMatchDialog.newInstance(competitor, "dq", getAdapterPosition());
                                dqDialog.setTargetFragment(CompsInMatchFragment.this, REQUEST_ACTION);
                                dqDialog.show(manager, DELETE_COMP_FROM_MATCH);
                                break;
                            case R.id.undo:
                                CompetitorStatusInMatchDialog undoDialog = CompetitorStatusInMatchDialog.newInstance(competitor, "undo", getAdapterPosition());
                                undoDialog.setTargetFragment(CompsInMatchFragment.this, REQUEST_ACTION);
                                undoDialog.show(manager, DELETE_COMP_FROM_MATCH);
                                break;
                            default:
                                popupMenu.dismiss();
                        }

                        return true;
                    }
                });

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

1 Ответ

0 голосов
/ 17 сентября 2018

Это потому, что вы надуваете меню внутри слушателя onClick, тем самым фактически добавляя все элементы каждый раз, когда отображается меню.

Если вы ожидаете, что dismiss удалит элементы из меню, это неправильно: оно будет скрывать только всплывающее окно.

Вы можете переместить эту строку за пределы слушателя:

popupMenu.inflate(R.menu.menu_edit_delete_dq_competitor);

как это:

final PopupMenu popupMenu = new PopupMenu(mContext, mOptionsMenu);
popupMenu.inflate(R.menu.menu_edit_delete_dq_competitor);
...