Java 实现 Android ViewPager2 顶部导航:动态配置与高效加载指南

发布于:2025-03-14 ⋅ 阅读:(19) ⋅ 点赞:(0)
  1. Java 实现:明确使用的编程语言。
  2. Android ViewPager2:技术栈和核心组件。
  3. 顶部导航:功能点。
  4. 动态配置与高效加载指南:突出动态配置的灵活性和性能优化的重点。
    在 Android 中使用 Java 实现 ViewPager2TabLayout 的顶部导航也是完全可行的。以下是详细的实现步骤,使用 Java 编写代码。

实现步骤

1. 添加依赖

build.gradle 中添加 ViewPager2Material Design 依赖:

dependencies {
    implementation 'androidx.viewpager2:viewpager2:1.0.0'
    implementation 'com.google.android.material:material:1.4.0'
}

2. 定义页面数据

创建一个 Page 类来管理页面的标题和图标。

// Page.java
public class Page {
    private String title;
    private int icon;

    public Page(String title, int icon) {
        this.title = title;
        this.icon = icon;
    }

    public String getTitle() {
        return title;
    }

    public int getIcon() {
        return icon;
    }

    public static final Page[] pages = {
            new Page("Home", R.drawable.ic_home),
            new Page("Dashboard", R.drawable.ic_dashboard),
            new Page("Notifications", R.drawable.ic_notifications)
    };
}

3. 创建 Fragment

为每个页面创建对应的 Fragment

// Fragment1.java
public class Fragment1 extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_1, container, false);
    }
}

// Fragment2.java
public class Fragment2 extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_2, container, false);
    }
}

// Fragment3.java
public class Fragment3 extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_3, container, false);
    }
}

4. 创建适配器

使用 FragmentStateAdapter 动态加载 Fragment

// ViewPagerAdapter.java
public class ViewPagerAdapter extends FragmentStateAdapter {
    public ViewPagerAdapter(FragmentActivity fragmentActivity) {
        super(fragmentActivity);
    }

    @Override
    public Fragment createFragment(int position) {
        switch (position) {
            case 0:
                return new Fragment1();
            case 1:
                return new Fragment2();
            case 2:
                return new Fragment3();
            default:
                throw new IllegalArgumentException("Invalid position");
        }
    }

    @Override
    public int getItemCount() {
        return Page.pages.length;
    }
}

5. 设置 ViewPager2 和 TabLayout

MainActivity 中设置 ViewPager2TabLayout 的联动。

// MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewPager2 viewPager = findViewById(R.id.viewPager);
        TabLayout tabLayout = findViewById(R.id.tabLayout);

        // 设置 ViewPager2 适配器
        viewPager.setAdapter(new ViewPagerAdapter(this));

        // 将 TabLayout 与 ViewPager2 联动
        new TabLayoutMediator(tabLayout, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                tab.setText(Page.pages[position].getTitle());
                tab.setIcon(Page.pages[position].getIcon());
            }
        }).attach();
    }
}

6. 布局文件

activity_main.xml 中定义布局,包含 TabLayoutViewPager2

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- 顶部导航 -->
    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="fixed"
        app:tabGravity="fill"/>

    <!-- ViewPager2 -->
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

</LinearLayout>

7. 扩展功能:动态添加页面

如果需要动态添加页面,可以修改 Page.pages 数组并通知适配器更新。

// 动态添加页面
Page[] newPages = Arrays.copyOf(Page.pages, Page.pages.length + 1);
newPages[newPages.length - 1] = new Page("Profile", R.drawable.ic_profile);
Page.pages = newPages;

// 通知适配器更新
viewPager.getAdapter().notifyDataSetChanged();

优化后的优势

  1. 高效加载FragmentStateAdapter 确保 Fragment 实例的高效管理。
  2. 动态配置:通过 Page 类动态配置页面,避免硬编码。
  3. 代码简洁:使用 Java 的标准写法,逻辑清晰。
  4. 可扩展性:添加新页面只需修改 Page.pages 数组,无需修改核心逻辑。

示例:添加新页面

如果需要添加一个新页面,只需修改 Page.pages 数组:

public static final Page[] pages = {
    new Page("Home", R.drawable.ic_home),
    new Page("Dashboard", R.drawable.ic_dashboard),
    new Page("Notifications", R.drawable.ic_notifications),
    new Page("Profile", R.drawable.ic_profile) // 新增页面
};

然后在 ViewPagerAdapter 中处理新页面:

@Override
public Fragment createFragment(int position) {
    switch (position) {
        case 0:
            return new Fragment1();
        case 1:
            return new Fragment2();
        case 2:
            return new Fragment3();
        case 3:
            return new Fragment4(); // 新增页面
        default:
            throw new IllegalArgumentException("Invalid position");
    }
}

总结

通过以上步骤,使用 Java 实现了 ViewPager2TabLayout 的顶部导航。代码结构清晰,易于扩展和维护。无论是静态页面还是动态页面,都可以轻松实现高效的顶部导航。