FragmentActivity 添加 Fragment1,Fragment1 再添加 Fragment2。Activity 無法直接獲取 Fragment2 實例,導致在 Activity 中重寫 onKeyDown 攔截返回鍵失效,Fragment2 內部處理也無法觸發。
定義接口,讓 Activity 實現,Fragment 持有接口引用調用:
public interface OnBackPressedListener {
boolean onBackPressed(); // 返回 true 表示已處理,不再向上傳遞
}
public class MainActivity extends FragmentActivity implements OnBackPressedListener {
@Override
public boolean onBackPressed() {
// 獲取當前顯示的 Fragment
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof OnBackPressedListener) {
return ((OnBackPressedListener) currentFragment).onBackPressed();
}
return false; // 未處理,執行默認返回邏輯
}
@Override
public void onBackPressed() { // 物理返回鍵觸發
if (!onBackPressed()) { // 接口方法名衝突,建議改名或邏輯調整
super.onBackPressed();
}
}
}
public class Fragment2 extends Fragment implements OnBackPressedListener {
@Override
public boolean onBackPressed() {
// 業務邏輯:如彈窗確認、重置狀態等
if (hasUnsavedChanges()) {
showSaveDialog();
return true; // 消費事件
}
return false; // 繼續向上傳遞
}
}
若使用 addToBackStack 管理棧,可設置監聽器:
getSupportFragmentManager().addOnBackStackChangedListener(() -> {
Fragment topFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
// 更新工具欄標題、按鈕狀態等
});
addToBackStack 可實現類似 Activity 的導航棧體驗。