ViewPager添加3个Tab绑定TabLayout后getChildCount()返回1,如何遍历设置长按监听
问题原因
TabLayout的getChildCount()返回的是自身直接挂载的一级子视图数量,你拿到的返回值1对应的是TabLayout内置的SlidingTabIndicator滑动容器,所有Tab项的视图都存放在这个容器的子层级中,因此不能用该方法统计Tab数量、遍历Tab项。
解决方案
推荐优先使用TabLayout官方提供的Tab操作API实现需求,需要注意setupWithViewPager执行后Tab视图不会立即完成渲染挂载,需要通过post方法等待布局完成后再操作,具体实现代码如下:
private void setupFragments(){ ViewPager mViewPager = findViewById(R.id.container); SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager()); adapter.addFragment(new SignalsFragment(),"Live Signals"); adapter.addFragment(new FavSignalsFragment(),"Fav Signals"); adapter.addFragment(new RemotesFragment(),"Remotes"); mViewPager.setAdapter(adapter); TabLayout tabLayout = findViewById(R.id.tabs); tabLayout.setupWithViewPager(mViewPager); // 等待TabLayout布局渲染完成后执行Tab遍历逻辑 tabLayout.post(() -> { // 用官方API获取Tab总数,返回值为3 int tabTotal = tabLayout.getTabCount(); System.out.println("Number Of Tabs: "+ tabTotal); for (int i = 0; i < tabTotal; i++) { TabLayout.Tab targetTab = tabLayout.getTabAt(i); if (targetTab == null || targetTab.view == null) { continue; } // 给每个Tab设置长按监听 targetTab.view.setOnLongClickListener(v -> { // 此处编写对应Tab的长按逻辑,i为当前长按Tab的索引 return true; }); } }); }
补充说明
如果你确实需要通过遍历子视图的方式实现,可以先拿到一级子容器再遍历子View,实现代码如下:
tabLayout.post(() -> { ViewGroup tabContainer = (ViewGroup) tabLayout.getChildAt(0); int tabTotal = tabContainer.getChildCount(); for (int i = 0; i < tabTotal; i++) { View tabView = tabContainer.getChildAt(i); tabView.setOnLongClickListener(v -> { // 长按逻辑 return true; }); } });
官方API的兼容性和稳定性更高,优先推荐第一种实现方式。
内容的提问来源于stack exchange,提问作者AKTanara
相关产品推荐
相关产品推荐

