在 ViewPager 中嵌套 Fragment 並嘗試在 Fragment 內跳轉到另一個 Fragment,屬於架構設計誤區。ViewPager 專為左右滑動切換頁面設計,Fragment 專為佔據整個 Activity 區域設計,兩者混用導致生命周期混亂、返回棧管理困難。本文分析誤區並給出正確架構。
FragmentActivityViewPager 綁定 4 個 Fragment(頁面 1-4)
FragmentPagerAdapter 將 Fragment 作為頁面容器,但 Fragment 內部不應再進行 Fragment 事務跳轉onResume/onPause 不代表用戶可見getFragmentManager().beginTransaction().replace() 會破壞 ViewPager 的頁面狀態
// 頁面1 Fragment 內按鈕點擊
button.setOnClickListener(v -> {
Intent intent = new Intent(getActivity(), DetailActivity.class);
intent.putExtra("data", someData);
startActivity(intent);
});
// DetailActivity.java
public class DetailActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail); // 包含底部導航的布局
// 底部導航設置
BottomNavigationView nav = findViewById(R.id.bottom_nav);
nav.setSelectedItemId(R.id.nav_detail); // 高亮對應項
// 加載目標 Fragment
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, new DetailFragment())
.commit();
}
}
}
優點:生命周期清晰、返回棧自然、導航狀態可控。
BottomNavigationView + FrameLayout 容器replace 不同 FragmentViewPager(僅展示子頁面,不跳轉)
// nav_graph.xml
// Fragment 內跳轉
findNavController().navigate(R.id.action_home_to_detail);
優點:聲明式導航、自動處理返回棧、深度鏈接、類型安全參數傳遞。
不要在 ViewPager 的 Fragment 內進行 Fragment 跳轉。選擇「新 Activity」或「單 Activity + Navigation Component」架構,將導航邏輯提升到 Activity 層級,保持 Fragment 輕量、專注於單一頁面展示。