在使用 ViewPager 搭配 Fragment 時,透過介面回調實現頁面切換是常見模式。但許多開發者會遇到螢幕旋轉(配置變更)後,按鈕點擊無法切換頁面的問題。
Activity 實現 OnChangePageButtonClick 介面,Fragment 持有該介面引用並在按鈕點擊時調用 selectPage()。代碼邏輯看似正確,但螢幕旋轉後失效。
問題在於 Fragment 重建機制 與 介面引用未及時更新:
FragmentStatePagerAdapter 的 getItem() 可能返回舊 Fragment 實例(取決於 setRetainInstance(true) 設置)public class MainPage extends Fragment {
private OnChangePageButtonClick listener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnChangePageButtonClick) {
listener = (OnChangePageButtonClick) context;
} else {
throw new RuntimeException(context.toString() + " must implement OnChangePageButtonClick");
}
}
@Override
public void onDetach() {
super.onDetach();
listener = null; // 防止記憶體洩漏
}
// 按鈕點擊時使用 listener.selectPage(1)
}
// 在 Fragment 中按需獲取最新引用
private OnChangePageButtonClick getListener() {
return (OnChangePageButtonClick) getActivity();
}
若 Fragment 不需保留狀態,移除 setRetainInstance(true) 可讓 Fragment 隨 Activity 重建,自動獲得新介面引用。
onAttach()/onDetach() 管理介面引用生命週期