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);
}
我发现这个问题很难解决。
我的应用有一个 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);
}