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

时间:2017-07-26 12:12:51

标签: android tabs android-viewpager android-tablayout

我正在使用TabLayoutViewPager相结合,并为我的标签设置了自定义视图。选择和取消选择选项卡时,所有内容都按预期工作(自定义视图根据所选/未选中的选项卡而更改)。
问题是在首次启动时,永远不会调用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

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

仅当选项卡选择发生任何更改时,才会调用

onTabSelected。就像你在第二个标签上选择第一个标签一样。所以不要改变你的观点。您可以在FragmentStatePagerAdapter getItem方法中添加它,您将获得当前所选位置。

答案 1 :(得分:0)

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

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);
   }

答案 2 :(得分:0)

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

由于默认情况下第一个标签为selected

这就是为什么您需要将代码同时放在onTabReselectedonTabSelected中,以便在选择任何标签时都执行所需的操作。

选择已选择的选项卡时,会调用

onTabReselected

因此,onTabReselected首次启动会完成您的工作。