0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PopupWindow + RecyclerView + NavigationComponentでPopupWindowが消えない

Last updated at Posted at 2022-05-23

PopupWindow + RecyclerView + NavigationComponentでPopupWindowが消えない

RecyclerView のItemとしてPopupWindowを表示するとき、PopupWindowを表示したままNavigationComponentで画面遷移をしようとするとPopupWindowが表示されたまま、取り残されたような表示になって対応が面倒だったので忘れないように対策をメモしておきます。

The popup window is a floating container that appears on top of the current activity.

公式ではこう説明されているのですが、どうやらPopupWindowは最前面に表示されるみたい?

画面タップで消えることは消えるんですが、うっかりPopupWindowの中身を押してしまうとNavigationComponentのdestination errorになってしまうため、対策することに。

RecyclerViewのItemに表示しているため、ViewHolder内の関数にアクセスしなければいけません。

MainItemAdapter.java
public class MainItemAdapter extends
        PagingDataAdapter<User,
                MainItemAdapter.MainViewHolder> {
    public VisitorItemAdapter(@NonNull DiffUtil.ItemCallback<User> itemCallback){
        super(itemCallback);
    }

    public MainViewHolder(@NonNull ItemVisitorBinding binding) {
            super(binding.getRoot());
        }

        public void closePopup(){
            if(popupWindow != null && popupWindow.isShowing()){
                popupWindow.dismiss();
            }
        }

        public void bind(User item){
        //Item処理実装
        }
//以下略

こんな感じですね。

FragmentのLifecycleに対応してclosePopup()を呼びたいため、
FragmentのCallbackに実装します。

MainFragment.java
private RecyclerView recyclerView;
private LinearLayoutManager manager;

@Override
    public void onPause(){
        if(manager!=null&&recyclerView!=null) {
            final int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();
            final int lastVisibleItemPosition = manager.findLastVisibleItemPosition();
            for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) {
                VisitorItemAdapter.VisitorViewHolder holder = (VisitorItemAdapter.VisitorViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                try {
                    holder.closePopup();
                } catch (NullPointerException | ClassCastException e) {
                    e.printStackTrace();
                }
            }
        }
        super.onPause();
    }

これでNavigation画面遷移前に呼ばれるonPause()でPopupWindowを消せます。
でももっといい実装方法がある気がする
誰か最適解を教えてくださいw

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?