`MainActivity` 只持有 `ViewPager`,每個頁面是獨立 `Fragment` + 獨立 XML 佈局,通過 `FragmentPagerAdapter` / `FragmentStatePagerAdapter` 管理。
public abstract class BaseFragment extends Fragment {
@Nullable @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(getLayoutId(), container, false);
}
protected abstract int getLayoutId();
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initViews(view);
}
protected abstract void initViews(View view);
}
// res/layout/fragment_home.xml
// res/layout/fragment_message.xml
// res/layout/fragment_profile.xml
public class HomeFragment extends BaseFragment {
@Override protected int getLayoutId() { return R.layout.fragment_home; }
@Override protected void initViews(View view) { /* findViewById、邏輯 */ }
}
public class MessageFragment extends BaseFragment { ... }
public class ProfileFragment extends BaseFragment { ... }
public class MainPagerAdapter extends FragmentStatePagerAdapter {
private final List fragments = new ArrayList<>();
private final List titles = new ArrayList<>();
public MainPagerAdapter(@NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
}
public void addFragment(Fragment fragment, String title) {
fragments.add(fragment);
titles.add(title);
}
@NonNull @Override public Fragment getItem(int position) { return fragments.get(position); }
@Override public int getCount() { return fragments.size(); }
@Nullable @Override public CharSequence getPageTitle(int position) { return titles.get(position); }
}
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 含 ViewPager + TabLayout
ViewPager vp = findViewById(R.id.viewPager);
TabLayout tab = findViewById(R.id.tabLayout);
MainPagerAdapter adapter = new MainPagerAdapter(getSupportFragmentManager(), BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
adapter.addFragment(new HomeFragment(), "首頁");
adapter.addFragment(new MessageFragment(), "消息");
adapter.addFragment(new ProfileFragment(), "我的");
vp.setAdapter(adapter);
tab.setupWithViewPager(vp); // 自動同步標題
}
}
<androidx.coordinatorlayout.widget.CoordinatorLayout ...>
<com.google.android.material.appbar.AppBarLayout ...>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
原最佳回答「ViewPager+Fragment、TabLayout」方向正確,上文提供完整可運行架構代碼、XML 佈局、基類封裝、優勢總結,可直接作為項目起手模板。