Я использую Kotlin и провел час для нахождения ошибок с этим кодом.
var viewPager: ViewPager = view.findViewById(R.id.viewPager)
...
adapter = TabAdapter(fragmentManager!!)
adapter.addFragment(Fragment1(), "Fragment 1")
adapter.addFragment(Fragment2(), "Fragment 2")
viewPager.adapter = adapter
tabLayout.setupWithViewPager(viewpager)
я могу скомпилировать это без ошибки, но заголовок вкладки не показывает, пока я не понимаю viewpager, который я присвоил tabLayout, не viewPager (заметьте использовать для своей выгоды 'P'). Это не производит ошибку, потому что kotlin найдет любой идентификатор расположения соответствия, в этом случае "viewpager", который является ViewPager, но на другом представлении.
Спасибо Hatem Badawi,
я начал разрабатывать в Java недавно. Я использовал WPF и XAML в .NET прежде, и вещи довольно отличаются там когда дело доходит до дизайна UI. Так или иначе у меня была та же проблема. Я хотел определить TabItem в XML вместо того, чтобы делать его программно. Как Вы упомянули, этот setupWithViewPager (), вызов сбрасывает текст и значок объектов вкладки к пустому указателю (Он использует тот же объект вкладки, просто сбрасывает его содержание). Я использовал Ваш подход, но сделал его более допускающим повторное использование. Вот мой код:
public class TabLayoutUtil {
public static void setupTabLayoutWithViewPager(TabLayout tabLayout, ViewPager viewPager) {
ArrayList<Pair<CharSequence, Drawable>> tabsContentCopy= new ArrayList<>();
for (int i = 0; i < tabLayout.getTabCount(); i++) {
TabLayout.Tab tab = tabLayout.getTabAt(i);
tabsContentCopy.add(new Pair<>(tab != null ? tab.getText() : null, tab != null ? tab.getIcon() : null));
}
tabLayout.setupWithViewPager(viewPager);
for (int i = 0; i < tabLayout.getTabCount(); i++) {
if (i<tabsContentCopy.size()) {
tabLayout.getTabAt(i).setText(tabsContentCopy.get(i).first);
tabLayout.getTabAt(i).setIcon(tabsContentCopy.get(i).second);
}
}
}
}