首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ViewPager + Fragment 實現多頁面滑動:每個 Fragment 獨立佈局文件

     編輯:程式設計綜合問答

架構模式

`MainActivity` 只持有 `ViewPager`,每個頁面是獨立 `Fragment` + 獨立 XML 佈局,通過 `FragmentPagerAdapter` / `FragmentStatePagerAdapter` 管理。

核心組件

1. Fragment 基類 (可選)


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);
}

2. 具體 Fragment (各自佈局)


// 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 { ... }

3. Adapter


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); }
}

4. Activity 掛載


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); // 自動同步標題
    }
}

5. activity_main.xml


<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>

關鍵優勢

  • ✅ **每個 Fragment 獨立 XML**,互不干擾,團隊並行開發無衝突。
  • ✅ `FragmentStatePagerAdapter` 銷毀不可见 Fragment 視圖,**內存友好**。
  • ✅ `TabLayout.setupWithViewPager()` **自動同步標題、指示器**,無需手動監聽滑動事件。
  • ✅ 支持 `addToBackStack`、嵌套 Fragment、懶加載 (`setUserVisibleHint` / `onResume`)。

原回答補充

原最佳回答「ViewPager+Fragment、TabLayout」方向正確,上文提供完整可運行架構代碼、XML 佈局、基類封裝、優勢總結,可直接作為項目起手模板。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved