【问题标题】:How to select a tab without triggering listener?如何在不触发侦听器的情况下选择选项卡?
【发布时间】:2018-11-17 07:19:39
【问题描述】:

我有多个标签,假设:

  1. 用户向下滑动:它应该根据哪个选项卡更改选项卡 它所在的类别。
  2. 用户点击选项卡:它应该移动 到该类别所在视图的顶部。

我的问题是,当我在用户进入某个视图时选择选项卡时,它会触发 onTabSelected 并滑动到视图顶部。

有没有一种方法可以在不触发侦听器的情况下更改选定的选项卡?

这是我的代码

public class Activity extends AppCompatActivity {

    public TabLayout tabLayout;
    public RecyclerView firstView,secondView;
    public NestedScrollView nestedScrollView;
    public RelativeLayout relativeLayout;
    public boolean clicked = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_meat_category);

//removed unimportant codes


        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);

          tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { // I removed the boolean here because I don't know where to change the value of it.
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                if(tabLayout.getSelectedTabPosition() == 0){
                    nestedScrollView.scrollTo(0, firstView.getTop());
                }else if(tabLayout.getSelectedTabPosition() == 1){
                    nestedScrollView.smoothScrollTo(0, secondView.getTop());
                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (scrollY <= firstView.getBottom()){
                    tabLayout.getTabAt(0).select();
                    clicked = false;
                } else if (scrollY >= secondView.getTop() && scrollY <= secondView.getBottom() ){
                    tabLayout.getTabAt(1).select();
                    clicked = false;
                }

            }

        });




    }
}

【问题讨论】:

  • 您能否分享您的代码以获取更多信息。
  • 您可以暂时删除OnTabSelectedListener——即致电setOnTabSelectedListener(null)——然后再将其重新设置。或者,您可以保留某种标志变量 - 例如,boolean - 以指示您是否应该在 onTabSelected() 中添加任何内容。
  • 嘿,迈克,谢谢你的建议。我已经尝试过布尔值。如果用户单击选项卡而不是滚动,我很难理解如何更改值。我已经编辑了我的问题。
  • @SavinSharma 我已经更新了!
  • @Kristofer 为什么每次更改选项卡时都将嵌套视图滚动到顶部?这肯定会将视图滑到顶部。

标签: java android tabs


【解决方案1】:

我遇到了同样的问题,只需通过下面的代码解决它。首先,我在课堂上声明 TabLayout.OnTabSelectedListener 字段 -

private TabLayout.OnTabSelectedListener tabSelectedListener;

 tabSelectedListener = new TabLayout.OnTabSelectedListener() { // I removed the boolean here because I don't know where to change the value of it.
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                if(tabLayout.getSelectedTabPosition() == 0){
                    nestedScrollView.scrollTo(0, firstView.getTop());
                }else if(tabLayout.getSelectedTabPosition() == 1){
                    nestedScrollView.smoothScrollTo(0, secondView.getTop());
                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

最后,删除选择前的tabSelectedListener,选择后重新添加。

nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (scrollY <= firstView.getBottom()){
                    /*First remove it*/
                    tabLayout.removeOnTabSelectedListener(tabSelectedListener);
                    tabLayout.getTabAt(0).select();
                    /*Then add it again*/
                    tabLayout.addOnTabSelectedListener(tabSelectedListener)

                    clicked = false;
                } else if (scrollY >= secondView.getTop() && scrollY <= secondView.getBottom() ){
                     /*First remove it*/
                    tabLayout.removeOnTabSelectedListener(tabSelectedListener);
                    tabLayout.getTabAt(1).select();
                     /*Then add it again*/
                    tabLayout.addOnTabSelectedListener(tabSelectedListener)
                    clicked = false;
                }

            }

        });

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2013-08-16
    • 2021-06-07
    • 2012-05-27
    • 2015-02-23
    相关资源
    最近更新 更多