web-dev-qa-db-ja.com

onTabSelected選択されていません

古いActionBarを新しいTabLayout(Support Material Design)に移行しました。

すべてが素晴らしいですが、タブ選択を傍受することはできませんonTabSelectedメソッドはTabLayoutが初めて表示されたときにのみ呼び出されますが、タブをクリックしても何も起こりません!このコードの何が問題なのでしょうか?

 tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    mViewPager = (ViewPager) findViewById(R.id.pager);
    if (mViewPager != null) {
        setupViewPager();
    }
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

            numTab = tab.getPosition();
            prefs.edit().putInt("numTab", numTab).apply();

        }

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

        }

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

        }
    });

    tabLayout.setupWithViewPager(mViewPager);
42

setupWithViewPagerを呼び出すと、OnTabSelectedListenerをオーバーライドして、setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));を内部的に呼び出します。

代わりに、リスナーは TabLayout.ViewPagerOnTabSelectedListener を拡張し、onTabSelected()をオーバーライドし、setOnTabSelectedListener()の後にsetupWithViewPager()を呼び出す必要があります。

tabLayout.setupWithViewPager(mViewPager);
tabLayout.setOnTabSelectedListener(
  new TabLayout.ViewPagerOnTabSelectedListener(mViewPager) {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        super.onTabSelected(tab);
        numTab = tab.getPosition();
        prefs.edit().putInt("numTab", numTab).apply();
    }
});
95
ianhanniballake

以下に、3つのタブがあるやや充実した例を示します。 addOnTabSelectedListenerではなく、より新しいsetOnTabSelectedListenerを使用します。

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
        (getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
        Log.i("TAG", "onTabSelected: " + tab.getPosition());
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {
        Log.i("TAG", "onTabUnselected: " + tab.getPosition());
    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {
        Log.i("TAG", "onTabReselected: " + tab.getPosition());
    }
});

ノート:

  • onTabSelectedonTabUnselectedは、タブに変更があるたびに呼び出されます。
  • onTabReselectedは、タブが既に表示されているときにタブが再度クリックされるたびに呼び出されます。
2
Suragch