如何在 Android 上的 TabLayout 中以编程方式添加选项卡
Posted
技术标签:
【中文标题】如何在 Android 上的 TabLayout 中以编程方式添加选项卡【英文标题】:How to add programmatically Tabs in TabLayout on Android 【发布时间】:2017-12-16 13:53:43 【问题描述】:在我的应用程序中,我想在tabLayout
中动态地创建tabs
,并且我想在从服务器获取数据时,并且该数据count > 0 然后创建tab
.
对于 TabLayout,我使用这个库:https://github.com/egemenmede/etiyabadgetab
为了这份工作,我写了以下代码:
FullSearchSendData sendData = new FullSearchSendData();
sendData.setKey(fullSearchText);
sendData.setLoadImages(true);
sendData.setSearchInCelebrities(true);
sendData.setSearchInMovies(true);
sendData.setSearchInSeries(true);
sendData.setSearchInEpisodes(true);
sendData.setSearchInUsers(true);
sendData.setPageIndex(1);
sendData.setPageSize(10);
sendData.setMaxDistance(1);
fullSearch_LoadLay.setVisibility(View.VISIBLE);
InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class);
Call<FullSearchResponse> call = api.getFullSearch(sendData);
call.enqueue(new Callback<FullSearchResponse>()
@Override
public void onResponse(Call<FullSearchResponse> call, Response<FullSearchResponse> response)
FullSearchResponse searchResponse = response.body();
if (searchResponse.getData().getCelebritiesCount() > 0)
celebritiesCount = searchResponse.getData().getCelebritiesCount();
celebrityList.clear();
celebrityList.addAll(searchResponse.getData().getCelebrities());
if (searchResponse.getData().getMoviesCount() > 0)
movieCount = searchResponse.getData().getMoviesCount();
movieList.clear();
movieList.addAll(searchResponse.getData().getMovies());
if (searchResponse.getData().getSeriesCount() > 0)
serieCount = searchResponse.getData().getSeriesCount();
seriesList.clear();
seriesList.addAll(searchResponse.getData().getSeries());
if (searchResponse.getData().getUsersCount() > 0)
usersCount = searchResponse.getData().getUsersCount();
userList.clear();
userList.addAll(searchResponse.getData().getUsers());
setupViewPager(fullSearch_ViewPager);
setupTabs();
fullSearch_LoadLay.setVisibility(View.GONE);
//fullSearch_Swipe.setRefreshing(false);
@Override
public void onFailure(Call<FullSearchResponse> call, Throwable t)
fullSearch_LoadLay.setVisibility(View.GONE);
fullSearch_ReloadLay.setVisibility(View.VISIBLE);
);
private void setupTabs()
if (celebritiesCount > 0)
fullSearch_tabLayout.addTab(new TabLayout(context).newTab());
fullSearch_tabLayout.selectEtiyaBadgeTab(0)
.tabTitle("Celebrities")
.tabTitleColor(R.color.white)
.tabBadge(true)
.tabBadgeCount(celebritiesCount)
.tabBadgeCountMore(false)
.tabBadgeBgColor(R.color.colorAccent)
.tabBadgeTextColor(R.color.white)
.tabBadgeStroke(2, R.color.white)
.tabBadgeCornerRadius(15)
.createEtiyaBadgeTab();
if (movieCount > 0)
fullSearch_tabLayout.addTab(new TabLayout(context).newTab());
fullSearch_tabLayout.selectEtiyaBadgeTab(1)
.tabTitle("Movies")
.tabTitleColor(R.color.white)
.tabBadge(true)
.tabBadgeCount(movieCount)
.tabBadgeCountMore(false)
.tabBadgeBgColor(R.color.colorAccent)
.tabBadgeTextColor(R.color.white)
.tabBadgeStroke(2, R.color.white)
.tabBadgeCornerRadius(15)
.createEtiyaBadgeTab();
if (serieCount > 0)
fullSearch_tabLayout.addTab(new TabLayout(context).newTab());
fullSearch_tabLayout.selectEtiyaBadgeTab(2)
.tabTitle("Series")
.tabTitleColor(R.color.white)
.tabBadge(true)
.tabBadgeCount(serieCount)
.tabBadgeCountMore(false)
.tabBadgeBgColor(R.color.colorAccent)
.tabBadgeTextColor(R.color.white)
.tabBadgeStroke(2, R.color.white)
.tabBadgeCornerRadius(15)
.createEtiyaBadgeTab();
if (usersCount > 0)
fullSearch_tabLayout.addTab(new TabLayout(context).newTab());
fullSearch_tabLayout.selectEtiyaBadgeTab(3)
.tabTitle("Users")
.tabTitleColor(R.color.white)
.tabBadge(true)
.tabBadgeCount(usersCount)
.tabBadgeCountMore(false)
.tabBadgeBgColor(R.color.colorAccent)
.tabBadgeTextColor(R.color.white)
.tabBadgeStroke(2, R.color.white)
.tabBadgeCornerRadius(15)
.createEtiyaBadgeTab();
private void setupViewPager(ViewPager viewPager)
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
if (celebritiesCount > 0)
adapter.addFrag(FullSearchCelebritiesFragment.getInstance(celebrityList, celebritiesCount, fullSearchText), "Celebrities");
if (movieCount > 0)
adapter.addFrag(FullSearchMovieFragment.getInstance(movieList, movieCount, fullSearchText), "Movies");
if (serieCount > 0)
adapter.addFrag(FullSearchSeriesFragment.getInstance(seriesList, serieCount, fullSearchText), "Series");
if (usersCount > 0)
adapter.addFrag(FullSearchUsersFragment.getInstance(userList, usersCount, fullSearchText), "Users");
viewPager.setAdapter(adapter);
class ViewPagerAdapter extends FragmentPagerAdapter
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
ViewPagerAdapter(FragmentManager manager)
super(manager);
@Override
public Fragment getItem(int position)
return mFragmentList.get(position);
@Override
public int getCount()
return mFragmentList.size();
public void addFrag(Fragment fragment, String title)
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
@Override
public CharSequence getPageTitle(int position)
return mFragmentTitleList.get(position);
但是当运行应用程序时显示这个错误:
Process: com.test.example, PID: 3804
java.lang.IllegalArgumentException: Tab belongs to a different TabLayout.
at android.support.design.widget.TabLayout.addTab(TabLayout.java:476)
at android.support.design.widget.TabLayout.addTab(TabLayout.java:464)
at android.support.design.widget.TabLayout.addTab(TabLayout.java:443)
at com.test.example.Activities.FullSearch.setupTabs(FullSearch.java:173)
at com.test.example.Activities.FullSearch.access$900(FullSearch.java:44)
at com.test.example.Activities.FullSearch$1.onResponse(FullSearch.java:156)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5349)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
当点击错误消息中的第一个链接时,转到此代码:
fullSearch_tabLayout.addTab(new TabLayout(context).newTab());
我该如何解决这个问题并在tabLayout
中动态地创建tabs
?
请帮帮我,我真的需要你的帮助。谢谢大家
【问题讨论】:
【参考方案1】:在您的 TabLayout 实例上调用 newTab() 函数。 'new' 关键字是问题所在,因为您正在为每个新选项卡创建 TabLayout 的新实例并尝试将其添加到现有实例中。
fullSearch_tabLayout.addTab(fullSearch_tabLayout.newTab());
【讨论】:
感谢不显示错误,但从 1 个选项卡创建 2 个选项卡!例如:创建 2 个用户选项卡。如:电影-系列-用户-用户!应该创建一个用户标签 如何解决? ? @Jongle 我不确定,我看不出重复的原因。尝试调试代码,也许你会发现何时出现重复(developer.android.com/studio/debug/index.html) @Jongle,也许你最初有标签,只需先通过 tab.removeAllTabs() 删除它们以上是关于如何在 Android 上的 TabLayout 中以编程方式添加选项卡的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中以编程方式创建 TabLayout
Android,TabLayout 计算错误高度,不会显示布局底部
如何使用 Android 代码中的 TabLayout 更改选定的选项卡文本颜色?