ViewPager 默認預加載左右各一頁,共三個 Fragment 實例同時存在。每個 Fragment 註冊 ContextMenu,長按時三個實例同時響應 → 觸發三次。
viewPager.setOffscreenPageLimit(0); // 僅保留當前頁,但可能影響滑動流暢度
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
if (!isVisible()) return; // 只有用戶可見的 Fragment 才註冊/響應
super.onCreateContextMenu(menu, v, menuInfo);
// 添加菜單項...
}
Fragment.isVisible() 綜合判斷:added + not hidden + not detached + userVisibleHint=true。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && getActivity() != null) {
registerForContextMenu(listView);
} else {
unregisterForContextMenu(listView); // 關鍵:不可見時取消註冊
}
}
ViewPager2 基於 RecyclerView,生命周期更精確,配合 FragmentStateAdapter 自動銷毀不可见 Fragment。RecyclerView.OnItemLongClickListener,天然無多實例問題。**ViewPager 預加載導致多 Fragment 共存**,同樣註冊 ContextMenu 會多次觸發。核心修復:**只在 Fragment 可見時註冊/響應菜單**(isVisible() 或 setUserVisibleHint)。長期建議遷移 ViewPager2 + RecyclerView 徹底解決。