好的,我一直在使用新Support Library
的ViewPager
and 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 存储库
SearchView 折叠代码(第 291 行)