TabLayout: show/hide 点击标签时的副标题

TabLayout: show/hide subtitle when click on a tab

我发现这个问题很难解决。

我的应用有一个 MainActivity,其中有一个包含 TabLayout 的 TabFragment。 我只想在用户单击第二个选项卡时在 MainActivity 的工具栏中显示副标题,并在我单击关闭时隐藏它。

我已经设法通过旁边的 NavigationDrawer 获取它(我也可以从那里 select 一个选项卡,一切正常)。 尽管如此,我还是不明白如何在选项卡(在片段中)上设置 setOnClickListener,然后仅当我在第二个选项卡中时才要求容器 Activity 显示字幕。

我在 MainActivity 中使用了这两种方法,用于 show/hide 副标题。

// Update the petrol stations' total count.
public void updatePetrolStationsCount(Toolbar toolbar) {
    PetrolLab petrolLab = PetrolLab.get(getApplicationContext());
    int petrolStationsSize = petrolLab.getPetrolStations().size();
    String totalCount = getResources().getQuantityString(R.plurals.total_count_format, petrolStationsSize, petrolStationsSize);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setSubtitle(totalCount);
}

// Hide the petrol stations' total count.
public void hidePetrolStationsCount(Toolbar toolbar) {
    String totalCount = null;

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setSubtitle(totalCount);
}

在我的 TabFragment 中,我正在为 TabPager 使用内部 class。

class TabPagerAdapter extends FragmentPagerAdapter {

    public TabPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    // Return fragment with respect to position.
    @Override
    public Fragment getItem(int position) {

        Fragment fragment;

        switch (position) {

            case MAP_POSITION:
                fragment = MapFragment.newInstance(MAP_TYPE);
                return fragment;

            case PETROL_POSITION:
                fragment = PetrolStationListFragment.newInstance(position);
                return fragment;

            case FAV_POSITION:
                return new FavouritesFragment();
        }

        return null;
    }

    @Override
    public int getCount() {
        return intItems;
    }

}

关于如何告诉 MainActivity 用户已经 select 编辑了 TabFragment 中的第二个选项卡的任何提示?就像在每个选项卡上放一个 Listener 一样。 谢谢

您可以在 MainActivity 上注册 BroadCastReceive,当您 select 第二个选项卡时向 BroadCast 发送消息 像这样:

 protected void onCreate(Bundle savedInstanceState) {
    //to register BroadCastReceive
    manager = LocalBroadcastManager.getInstance(this);
     myReceive =  new MyReceiver();
    IntentFilter filter = new IntentFilter();   
    filter.addAction("com.action.changetab");//fill you want to write
    manager.registerReceiver(myReceive,filter);
}

class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
          int xy= intent.getIntExtra("xy",0);
          if(xy==1){
            //change tab
          }
     }
}

片段

manager = LocalBroadcastManager.getInstance(this);
Intent intent= new Intent("com.action.changetab");//same as you filter
                     intent.putExtra("xy",1);
                     manager.sendBroadcast(intent);

你最好先从google学习BroadCast,它会让你对它有更深入的了解

好的,感谢Cgx,我设法解决了问题。

我已经像他说的那样设置了我的 MainActivity,然后在 TabFragment:

里面
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    ...

    mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

        int flag;

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            mViewPager.setCurrentItem(tab.getPosition());

            if (tab.getPosition() == PETROL_POSITION) {
                flag = 1;
                sendBroadcast(flag);
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            if (tab.getPosition() == PETROL_POSITION) {
                flag = 0;
                sendBroadcast(flag);
            }
        }

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

        }

    });

    return view;

}

// Send a broadcast to MainActivity about the tab we are inside to.
public void sendBroadcast(int flag) {
    mLocalBroadcastManager = LocalBroadcastManager.getInstance(getActivity());
    Intent intent = new Intent(ACTION_TAB_ID);
    intent.putExtra(EXTRA_TAB_ID, flag);
    mLocalBroadcastManager.sendBroadcast(intent);
}