Android - onTabSelected 首次使用 customView 时未调用



我正在使用与ViewPager结合使用的TabLayout,并且我已经为我的选项卡设置了自定义视图。选择和取消选择选项卡时,一切都按预期工作(自定义视图根据所选/未选择的选项卡进行更改(。
问题是在首次启动时,永远不会调用 onTabSelected 方法。
这是我的活动:

setupViewPager(viewPager);    
tabLayout.setupWithViewPager(viewPager);     
for (int i = 0; i < tabLayout.getTabCount(); i++) {
tabLayout.getTabAt(i).setCustomView(getViewAt(i));
}
tabLayout.addOnTabSelectedListener(this);    

这是setupViewPager和其他方法:

private void setupViewPager(ViewPager viewPager) {
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getChildFragmentManager(), getContext(), startDate, endDate);
viewPager.setAdapter(adapter);
}    
private View getViewAt(int i){
final Date currentDate = CalendarUtility.addDay(startDate, i);
View v = LayoutInflater.from(getContext()).inflate(R.layout.layout_custom_tab, null);
TextView day = (TextView) v.findViewById(R.id.day);
TextView num = (TextView) v.findViewById(R.id.num);
day.setText(CalendarUtility.getDayOfWeek(currentDate));
num.setText(CalendarUtility.getDayOfMonth(currentDate));
return v;
}
@Override
public void onTabSelected(TabLayout.Tab tab) {
Toast.makeText(getContext(), "Tab #"+tab.getPosition(), Toast.LENGTH_LONG).show();
TextView num = (TextView)tab.getCustomView().findViewById(R.id.num);
num.getBackground().setColorFilter(textDarkColor, PorterDuff.Mode.SRC_IN);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
TextView num = (TextView)tab.getCustomView().findViewById(R.id.num);
num.getBackground().setColorFilter(pinkDarkColor, PorterDuff.Mode.SRC_IN);
}

最后,这是浏览选项卡
时的行为 https://i.stack.imgur.com/Scm9P.png

首次启动时的选项卡,未选择
任何选项卡 https://i.stack.imgur.com/a6Xgd.png

有人可以帮忙吗?

实现自定义视图没有问题。

由于默认情况下selected第一个选项卡。

这就是为什么您需要将代码放在onTabReselected中,并onTabSelected两者一起在选择任何选项卡时执行所需的操作。

选择已选择的选项卡时调用onTabReselected

因此,在首次启动时,onTabReselected将完成您的工作。

onTabSelected 仅在选项卡选择发生任何更改时才调用。就像您在第二个选项卡上并选择第一个选项卡一样。因此,与其改变你在其中的观点。您可以将其添加到FragmentStatePagerAdapter getItem方法中,您将获得当前选定的位置。

在你的适配器类中,创建两个方法。

public void setOnSelectedView(TabLayout tabLayout, int position) {
TabLayout.Tab tab = tabLayout.getTabAt(position);
if (tab != null) {
View selected = tab.getCustomView();
TextView num = (TextView)selected.findViewById(R.id.num);
num.getBackground().setColorFilter(textDarkColor, PorterDuff.Mode.SRC_IN);
tab.select();
}
}
public void setunSelectedView(TabLayout tabLayout, int position) {
TabLayout.Tab tab = tabLayout.getTabAt(position);
if (tab != null) {
View selected = tab.getCustomView();
TextView num = (TextView)selected.findViewById(R.id.num);
num.getBackground().setColorFilter(pinkDarkColor, PorterDuff.Mode.SRC_IN);
tab.select();
}
}

现在在onTabSelectedonTabUnselected方法调用这些方法。

如果您想启动第一个选定的选项卡,则onCreate()方法调用

setOnSelectedView(0,tabLayout);

注意:另一种方法是getViewAt()方法中只需检查它的位置

if(i==0){
num.getBackground().setColorFilter(textDarkColor, PorterDuff.Mode.SRC_IN);
}else{
num.getBackground().setColorFilter(pinkDarkColor, PorterDuff.Mode.SRC_IN);
}

最新更新