錯誤:`IllegalStateException: Fragment already added: LeagueFragment`,Tab 切換時反覆 `add` 同一 Fragment 實例導致崩潰。
// ❌ 每次切換都嘗試 add,若已 added 崩潰
if (!fragment.isAdded()) {
transaction.add(R.id.container, fragment, tag);
}
// 隱藏其他
for (int i = 0; i < 4; i++) if (i != pos) transaction.hide(fragments[i]);
transaction.show(fragment).commit();
private void switchTab(int position) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment target = fragments[position];
// 1. 隱藏所有已添加的 Fragment
for (Fragment f : fragments) {
if (f != null && f.isAdded()) ft.hide(f);
}
// 2. 目標 Fragment:未添加則 add,已添加則 show
if (!target.isAdded()) {
ft.add(R.id.container, target, String.valueOf(position));
} else {
ft.show(target);
}
ft.commit();
}
// 1. 布局
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
// 2. 適配器
class TabAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
private val fragments = listOf(MshopFragment(), ApplyFragment(), LeagueFragment(), MyFragment())
override fun getItemCount() = fragments.size
override fun createFragment(position: Int) = fragments[position]
}
// 3. 綁定 TabLayout
TabLayoutMediator(tabLayout, viewPager) { tab, position ->
tab.text = titles[position]
tab.icon = icons[position]
}.attach()
// 4. 預加載鄰頁(可選)
viewPager.offscreenPageLimit = 1
| 指標 | 手動 FragmentTransaction | ViewPager2 + FSA |
|---|---|---|
| 代碼量 | ~80 行 | ~20 行 |
| 生命周期管理 | 手動 hide/show | 自動 DESTROY/CREATE |
| 滑動手勢 | 需自行實現 | 原生支援 |
| 預加載控制 | 無 | `offscreenPageLimit` |
| 動畫定制 | 困難 | `FragmentTransaction` 兼容 |