Fragment A → Fragment B(添加到回棧),B 返回 A 時需根據 B 的輸入更新 A 的 UI。原代碼:
// A 跳 B
getParentFragment().getFragmentManager().beginTransaction()
.add(R.id.main_fragment, fragmentB).addToBackStack(null)
.commitAllowingStateLoss();
// B 返回
getFragmentManager().popBackStack(); // A 的 onCreateView 不再執行,UI 不更新
popBackStack() 只是將 Fragment B 移除,Fragment A 實例**仍在內存中**,其 onCreateView **不會重新調用**,只有 onResume、onStart 等生命周期方法會觸發。若在 onCreateView 初始化 UI,返回時自然不會刷新。
implementation 'org.greenrobot:eventbus:3.3.1'
public class FragmentBResultEvent {
public final String inputData;
public FragmentBResultEvent(String data) { this.inputData = data; }
}
EventBus.getDefault().post(new FragmentBResultEvent(editText.getText().toString()));
getFragmentManager().popBackStack();
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onFragmentBResult(FragmentBResultEvent event) {
// 更新 UI
textView.setText(event.inputData);
}
// A 中啟動 B
fragmentB.setTargetFragment(this, REQUEST_CODE);
getParentFragment().getFragmentManager().beginTransaction()
.add(R.id.main_fragment, fragmentB).addToBackStack(null).commit();
// B 中返回數據
Intent intent = new Intent();
intent.putExtra("data", result);
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
popBackStack();
// A 中處理
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
String result = data.getStringExtra("data");
// 更新 UI
}
}
// Activity/Fragment 持有同一 ViewModel 實例
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
// B 更新數據
model.getInputData().setValue(userInput);
// A 觀察數據
model.getInputData().observe(getViewLifecycleOwner(), data -> {
textView.setText(data);
});
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| EventBus | 完全解耦、跨任意組件通信、代碼簡潔 | 引入三方庫、運行時才發現類型錯誤 | 中小項目、快速開發、多層級通信 |
| setTargetFragment | 官方 API、無三方依賴 | 代碼冗長、強耦合 Target、需處理狀態丟失 | 嚴格遵循官方規範、無法引入三方庫 |
| SharedViewModel | 生命周期感知、配置變更生存、架構組件標準 | 需理解 ViewModel/LiveData、略增複雜度 | 新項目、MVVM 架構、長期維護 |
onCreateView 做一次性初始化,改用 onViewCreated 或 onResume 根據最新數據刷新 UI。Fragment 返回不觸發 onCreateView 是正常行為。推薦使用 **EventBus**(輕量解耦)或 **SharedViewModel**(架構規範)實現 Fragment 間數據回傳與 UI 更新,避免強耦合與生命周期陷阱。