Android - onTabSelected 第一次使用 customView 时未调用

Leo*_*ald 2 tabs android android-viewpager android-tablayout

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

setupViewPager(viewPager);    
tabLayout.setupWithViewPager(viewPager);     

for (int i = 0; i < tabLayout.getTabCount(); i++) {
    tabLayout.getTabAt(i).setCustomView(getViewAt(i));
}

tabLayout.addOnTabSelectedListener(this);    
Run Code Online (Sandbox Code Playgroud)

这是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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

有人可以帮忙吗?

Vik*_*ari 5

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

因为第一个选项卡是selected默认的。

这就是为什么您需要放入代码onTabReselected以及onTabSelected在选择任何选项卡时执行所需操作的代码。

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

所以在第一次启动时onTabReselected就会完成你的工作。