如何在TabLayout上的Activity中获取选项卡点击事件(Android)

38

这是我活动中onCreate方法的实现。我需要动态创建选项卡。为了简单起见,我制作了2个选项卡。

public class ActivityProductList extends AppCompatActivity {

    private android.support.v7.widget.SearchView searchView = null;
    private RecyclerView recyclerView;
    MyAdapter adapter;
    List<ParentListItem> parentListItems = new ArrayList<>();
    List<ParentListItem> originalProductList = new ArrayList<>();
    String query = null;
    int categoryId = 0;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("PRODUCTS");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        //ViewPager viewPager = (ViewPager) findViewById(R.id.pager);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        //setupViewPager(viewPager);
        //tabLayout.setupWithViewPager(viewPager);
        //viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        searchView = (android.support.v7.widget.SearchView) findViewById(R.id.searchView);
        searchView.setIconified(false);
        searchView.onActionViewExpanded();
        searchView.clearFocus();
        searchView.setOnQueryTextListener(new android.support.v7.widget.SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                if (adapter != null)
                    filterData(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                if (adapter != null)
                    filterData(query);
                return false;
            }
        });

    }
}

我希望在点击选项卡时更改同一活动中的EditText的值。

如何在活动中获取选项卡点击事件?


那么,OnTabSelectedListener 怎么样? - Mike M.
8个回答

61
你可以使用onTabSelected监听器来实现这一点。
tabLayout.addOnTabSelectedListener(new OnTabSelectedListener() {
        @Override
        public void onTabSelected(Tab tab) {
             switch(tab.getPosition()) {
                 case 0:
                  ....
             }
        }

P.S. setOnTabSelectedListener已被弃用,请使用addOnTabSelectedListener代替。


16
请注意:onTabSelected 方法不仅在点击选项卡时被调用,也会在滑动选项卡时被调用。 - dgngulcan
onTabReselected()方法在点击一个标签两次时被调用。调试器会遍历所有的标签,但是应用程序只处理正确的标签? - undefined

30

您可以像这样在 Kotlin 中使用 onTabSelected 监听器

tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
            override fun onTabSelected(tab: TabLayout.Tab?) {
            }

            override fun onTabUnselected(tab: TabLayout.Tab?) {
            }

            override fun onTabReselected(tab: TabLayout.Tab?) {
            }
        })

9
请注意:onTabSelected方法会在切换选项卡时被调用,不仅限于点击标签,也包括滑动。 - dgngulcan
1
要在override fun onTabSelected(p0: TabLayout.Tab?)中获取位置,请使用p0?.position!! - GilbertS

3

如果您想在点击选项卡时触发而不是每次选中选项卡时触发,可以为每个选项卡使用自定义视图,然后像这样处理各自视图上的单击:

for (int i = 0; i < tabLayout.getTabCount(); i++) {
    final TabLayout.Tab tab = tabLayout.getTabAt(i);
    final View tabView = LayoutInflater.from(this).inflate(
            R.layout.item_tab, (ViewGroup) tab.getCustomView(), false);
    tabLayout.setCustomView(tabView);

    final TextView customView = (TextView) tab.getCustomView();
    customView.setText(mAdapter.getPageTitle(i));
    final int index = i;
    customView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (tabLayout.getSelectedTabPosition() == index) {
                // change edittext value
            } else {
                tab.select();
            }
        }
    });
}

处理选项卡内部的选项卡点击的另一种方法是在onTabSelectedListener中覆盖onTabReselected方法。 - urgentx

1

如 @dgngulcan 所提到的,onTabSelected 函数不仅在点击选项卡时被调用,滑动也会触发它。

我们可以直接使用选项卡中的视图作为参数。

这里我将选项卡与视图页一起使用,并添加了一个点击监听器,如果被点击则调用特定函数。

tabLayout = binding.tabLayout
    val tabAll = tabLayout.newTab().setText("All")
    val tabFavourite = tabLayout.newTab().setText("Favourite")
    tabLayout.addTab(tabAll)
    tabLayout.addTab(tabFavourite)
    tabLayout.setSelectedTabIndicatorColor(Color.WHITE)

    tabAll.view.setOnClickListener {
        if(viewPager.currentItem==0)
            allCoinsListFragment.scrollToTop()
        else
        viewPager.currentItem = 0
    }
    tabFavourite.view.setOnClickListener {
        if(viewPager.currentItem==1)
            favouriteCoinsListFragment.scrollToTop()
        else
        viewPager.currentItem = 1
    }

1

在Java中,

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                int position = tab.getPosition();
                Toast.makeText(this, "position : "+position, Toast.LENGTH_SHORT).show();
            }

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

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

0
这是我根据Shashank Udupa的答案进行的Xamarin.Android/C#移植版本,对我有效:
首先,你应该按照以下方式实现IOnTabSelectedListener接口:
public class MyOnTabSelectedListener : Java.Lang.Object, TabLayout.IOnTabSelectedListener
{
    Activity _activity;

    public MyOnTabSelectedListener(Activity activity)
    {
        _activity = activity;
    }

    public void OnTabReselected(TabLayout.Tab tab)
    {
    }

    public void OnTabSelected(TabLayout.Tab tab)
    {
        switch (tab.Position)
        {
            case 0:
                // your logic goes here!
                break;

            // ...
        }
    }

    public void OnTabUnselected(TabLayout.Tab tab)
    {
    }
}

然后像这样使用上面的类:

tabLayout.AddOnTabSelectedListener(new MyOnTabSelectedListener(this));

0

这可能对某人有所帮助

TabLayoutMediator(tabLayout, viewPager) { tab, position ->
                tab.text = tabTitle[position]
                if (position == YOUR_TAB_POSITION) {
                    tab.view.isClickable = false
                    tab.view.setOnTouchListener { view, motionEvent ->
                        if(Your_condition){ 
                            false
                        } else {
                            view.performClick()
                        }
                    }
                } else {
                    tab.view.isClickable = true
                }
            }.attach()

我没有使用onTouch来切换普通选项卡的点击,因为它会破坏TabLayout的滑动动画,所以我仍然使用clickable = true


0
private fun setupTabLayout() {

    tabLayout?.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {

        override fun onTabSelected(tab: TabLayout.Tab?) {

            when (tab?.position){
                0 -> println(0)
                1 -> println(1)
                2 -> println(2)
            }
        }

        override fun onTabReselected(tab: TabLayout.Tab?) {
            // Write code to handle tab reselect
        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {
            // Write code to handle tab reselect
        }
    })
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接