【问题标题】:Change behavior when a tab in TabLayout is selected选择 TabLayout 中的选项卡时更改行为
【发布时间】:2018-04-26 14:17:59
【问题描述】:

我有一个基本的 TabLayout,它在 2 个选项卡下有 2 个列表(选项卡 A 中的 1 个列表和选项卡 B 中的 1 个列表)设置与 ViewPager 类似如下。

// CustomPagerAdapter extends PagerAdapter
CustomPagerAdapter adapter = new CustomPagerAdapter(getFragmentManager());
adapter.addFragments();
TabLayout tabLayout = findViewById(R.id.tab_layout);
ViewPager viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(PagerAdapter);
tabLayout.setupWithViewPager(viewPager);

给定的情况是用户正在屏幕上看到选项卡 A。此时,当用户点击选项卡 B 时,我希望应用发出一条祝酒消息,说明无法查看选项卡 B,而不是实际导航到选项卡 B。

换句话说,我不希望应用导航到选项卡 B,我只希望它在用户点击选项卡 B 时在选项卡 A 上显示 Toast 消息。

我尝试过类似的东西 ((LinearLayout) tabLayout.getChildAt(0)).setEnabled(false); 但这不起作用,因为该选项卡已被上面的代码禁用,因此它甚至不显示 Toast 消息,因为它没有感应到点击事件。

我觉得我需要保持启用它(通过 setEnabled(true) 或其他方式)并以某种方式覆盖该方法,以便应用显示 Toast 消息而不是导航到另一个选项卡。

我怎样才能做到这一点?我找不到与此问题相关的任何其他 stackoverflow 帖子..

请帮忙!

【问题讨论】:

    标签: android tabs android-viewpager toast android-tablayout


    【解决方案1】:

    使用此代码启用/禁用 tablayout 中的任何选项卡:

    LinearLayout tabStrip = ((LinearLayout)tabLayout.getChildAt(0));
                tabStrip.getChildAt(1).setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
    
                         if(your condition) {
                        Toast.makeText(getActivity(), "Tab Enable", Toast.LENGTH_SHORT).show();
                        return false;
                        } else {                   
                        Toast.makeText(getActivity(), "Tab Disable", Toast.LENGTH_SHORT).show();
                        return true;
                         }
                    }
                });
    

    【讨论】:

    • 谢谢。我不得不稍微调整一下,但仍然很有帮助。
    【解决方案2】:

    尝试如下向 tablayout 添加监听器

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
                    tab.select();
                    Toast.makeText(getContext(), "This is toast", Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
    

    【讨论】:

    • 这并不能解决问题,因为它们会在标签 b 已经打开后被调用
    • 是的.. 它只会在打开第二个标签后才能返回到第一个标签。