在不更改选定选项卡的情况下动态更新 TabLayout

Posted

技术标签:

【中文标题】在不更改选定选项卡的情况下动态更新 TabLayout【英文标题】:Dynamically updating TabLayout without changing selected tab 【发布时间】:2016-03-23 03:18:45 【问题描述】:

我想用材料设计支持库实现一个向导。

我正在使用ViewPagerTablayout,但动态添加新标签时遇到问题。

首先,我在onCreate 方法中设置了我的小部件:

viewPager = (ViewPager) findViewById(R.id.tab_viewpager);
tabLayout = (TabLayout) findViewById(R.id.tab_layout);

adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFrag(new DummyFragment(), "1");
adapter.addFrag(new DummyFragment(), "2");
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);

然后我想添加另一张卡片,当点击列表中的一个元素时:

adapter.addFrag(new DummyFragment(), "3");
adapter.notifyDataSetChanged();
tabLayout.setTabsFromPagerAdapter(adapter);

问题是:添加后,选择的卡被重置为第一个。

如何防止这种行为?

【问题讨论】:

【参考方案1】:

刚刚遇到同样的问题,幸运的是找到了一个解决方案(不是很漂亮,但它有效):

当您需要更新标签时:

pageradapter.notifyDataSetChanged();
for (int i = 0; i < viewpager.getCount(); i++) 
    sectionsTabLayout.getTabAt(i).setText(sectionsViewPagerAdapter.getPageTitle(i));

【讨论】:

【参考方案2】:

这是对@Kalpit 代码的轻微修改。 您必须将这个新选项卡动态添加到我们的布局中,并通过从适配器调用相同的方法来分配标题,当您使用 setupWithViewPager 方法时,该方法由 tablayout 调用。所以我对尚未创建的选项卡使用了这个 try catch 语句但您可以尝试为它们分配一些标题。

    adapter.notifyDataSetChanged();
    for(int i = 0;i<adapter.getCount();i++)
      try
        tablayout.getTabAt(i).setText(adapter.getPageTitle(i));
      
      catch(IndexOutOfBoundException e)
        tablayout.addTab(tablayout.newTab().setText(adapter.getPageTitle(i));
      
    

【讨论】:

以上是关于在不更改选定选项卡的情况下动态更新 TabLayout的主要内容,如果未能解决你的问题,请参考以下文章

更改 QTabWidget 中选定选项卡的光标

如何更改 TabLayout 选定选项卡的图标颜色?

如何更改角度材料中选定选项卡的下划线颜色?

JQuery Tabs - 在输入条目上更改选项卡的背景颜色

在不重新加载页面的情况下更新 Django 中的表单值?

如何更改选项卡布局中所选选项卡的形状?