4

好的,我一直在使用新Support LibraryViewPagerand TabLayout,在我的应用程序中,我根据SearchView用户是否打开/关闭来动态添加和删除选项卡。

我的实施有效;但是,选项卡指示器似乎存在视觉错误。显示了正确的选项卡片段,但选项卡指示符在错误的选项卡下!!

我做了很多测试,看看这是否是我的问题,但后来发现这是支持库的错误。我向 Google 发送了错误报告,但报告的状态被标记为userError.

所以谷歌开发者给了我一个想法。我试过说修复;但是,它没有解决任何问题。在过去的几个小时里,我做了一些更深入的测试,因为他说正确的行为取决于是否调用了ViewPager's 。OnPageChangedListener

我在我的错误报告中添加了额外的信息,但由于它被标记为 userError,我不知道开发人员是否会做出回应。所以我现在就在这里。

屏幕录制

这是问题的屏幕录像 {注意:单击此链接将自动下载屏幕录像[.mp4] }。注意标签指示器。它应该转到上一个显示的选项卡,但没有。

问题

1.正确的指标,错误的显示片段

    @Override
    public boolean onMenuItemActionCollapse(final MenuItem item) {

        clearAllTabs();
        addTabs(displayedTabs);

        viewPager.setCurrentItem(previousTabPosition, true);

        tabLayout.removeAllTabs();
        tabLayout.setupWithViewPager(viewPager);

        return true;

    }

堆栈跟踪:

首先转到第二个选项卡,单击 SearchView,然后关闭 SearchView...。

On MenuItemCompat.OnActionExpandListener::onMenuItemActionCollapse(...)

    clearAllTabs()           [A, B, C, Search] -> []
    addTabs(displayedTabs)   [] -> [A, B, C]

    ViewPager.OnPageChangeListener::OnPageSelected(2)
    ViewPager.OnPageChangeListener::OnPageScrolled(2, 0.0, 0)

    viewPager.setCurrentItem(1, true)

    ViewPager.OnPageChangeListener::onPageScrollStateChanged(2)
    ViewPager.OnPageChangeListener::onPageSelected(1)

    tabLayout.removeAllTabs()
    tabLayout.setupWithViewPager(viewPager);

    ViewPager.OnPageChangeListener::onPageSelected(0) [NOTE: this statement does not fire if Tab A was displayed before opening SearchView]

    return true

    ViewPager.OnPageChangeListener::onPageScrolled(0, 0.0, 0)

    // UI display is updated (Tab 1 fragment is displayed, but tab indicator is on 2nd Tab)

    ViewPager.OnPageChangeListener::onPageScrollStateChanged(0)

2.正确显示的片段,错误的标签指示符

    @Override
    public boolean onMenuItemActionCollapse(final MenuItem item) {

        clearAllTabs();
        addTabs(displayedTabs);

        tabLayout.removeAllTabs();
        tabLayout.setupWithViewPager(viewPager);

        viewPager.setCurrentItem(previousTabPosition, true);

        return true;

    }

堆栈跟踪:

首先转到第二个选项卡,单击 SearchView,然后关闭 SearchView...。

On MenuItemCompat.OnActionExpandListener::onMenuItemActionCollapse(...)
    clearAllTabs()           [A, B, C, Search] -> []
    addTabs(displayedTabs)   [] -> [A, B, C]

    ViewPager.OnPageChangeListener::OnPageSelected(2)
    ViewPager.OnPageChangeListener::OnPageScrolled(2, 0.0, 0)

    tabLayout.removeAllTabs()
    tabLayout.setupWithViewPager(viewPager);

    ViewPager.OnPageChangeListener::onPageScrollStateChanged(2)
    ViewPager.OnPageChangeListener::onPageSelected(0)

    viewPager.setCurrentItem(1, true)

    ViewPager.OnPageChangeListener::onPageSelected(1)

    return true

    ViewPager.OnPageChangeListener::onPageScrolled(1, 0.0, 0)

    // UI display is updated (Tab 2 fragment is displayed, but tab indicator is on 3rd Tab)

    ViewPager.OnPageChangeListener::onPageScrollStateChanged(0)

GitHub

这是我的GitHub 存储库

4

0 回答 0