【问题标题】:Android - onTabSelected not called at first time with customViewAndroid - 在第一次使用 customView 时未调用 onTabSelected
【发布时间】:2019-04-17 17:56:16
【问题描述】:

我正在使用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

有人可以帮忙吗?

【问题讨论】:

    标签: android tabs android-viewpager android-tablayout


    【解决方案1】:

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

    因为第一个标签默认是selected

    这就是为什么您需要将代码放在onTabReselectedonTabSelected 中,这两个代码都会在选择任何选项卡时执行所需的操作。

    onTabReselected 在选择了已选择的选项卡时被调用。

    所以在第一次发布时onTabReselected 将完成您的工作。

    【讨论】:

    • OnTabreselected 有效,通常当某些 api 调用返回该状态的某些内容时,没有选择任何内容,如果选择了另一个选项卡,则它不会被调用,然后 On TabReselected 有效!另外我想说我爱你你救了我!!!!!!!!!
    【解决方案2】:

    onTabSelected 仅在选项卡选择发生任何变化时调用。就像您在第二个选项卡上并选择了第一个选项卡一样。所以不要改变你对它的看法。您可以在 FragmentStatePagerAdapter getItem 方法中添加它,您将获得当前选择的位置。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 第一个解决方案就像一个魅力,当然第二个也是@Piyush
      • @Leonald 太棒了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      相关资源
      最近更新 更多