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
内の関数にアクセスしなければいけません。
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に実装します。
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