首页 > 解决方案 > 这个 setupWithViewPager 错误有什么解决方案吗?

问题描述

自昨晚以来,我一直在对此进行故障排除,我使用了 viewpager2,因为 androidstudio 中的原始 viewpager 丢失了。我不知道是什么导致了错误,你们能帮帮我吗?

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

        firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        myRef = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                Users users = snapshot.getValue(Users.class);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
        //TabLayout and viewpager
        TableLayout tabLayout = findViewById(R.id.tabLayout);
        ViewPager viewPager = findViewById(R.id.view_pager);

        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPagerAdapter.addFragment(new ChatFragment(), "chats" ); // this line can crash
        viewPagerAdapter.addFragment(new UsersFragment(), "Users" ); // this line can crash

        viewPager.setAdapter(viewPagerAdapter);

        tabLayout.setupWithViewPager(viewPager);

    }```

标签: javaandroidandroid-studioandroid-viewpagerandroid-tablayout

解决方案


重构 TabLayout 接口

最后,您必须更新将 TabLayout 对象附加到 ViewPager 对象的代码。虽然 TabLayout 使用自己的 setupWithViewPager() 方法与 ViewPager 集成,但它需要一个 TabLayoutMediator 实例才能与 ViewPager2 集成。

要使用 ViewPager2,您不能再使用setupWithViewPager方法,而必须使用 TabLayoutMediator。

// TODO: Comment-out or remove this line
// tabLayout.setupWithViewPager(viewPager);

new TabLayoutMediator(tabLayout, viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
    @Override
    public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
        String tabTitle = "";
        if (position == 0) {
            tabTitle = "chats";
        } else if (position == 1) {
            tabTitle = "Users";
        }
        tab.setText(tabTitle);
    }
}).attach();

此外,您永远不应该将实际的 Fragment 实例传递给 FragmentPagerAdapter。您应该始终getItem()在内部(在 FragmentPagerAdapter/FragmentStatePagerAdapter 的情况下)和内部createFragment()(在 的情况下)创建Fragment的新实例FragmentStateAdapter


推荐阅读