【问题标题】:TabLayout: show/hide subtitle when click on a tabTabLayout:单击选项卡时显示/隐藏字幕
【发布时间】:2016-07-03 12:08:48
【问题描述】:

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

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

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

我的 MainActivity 中有这两种方法,用于显示/隐藏字幕。

// 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 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 用户已选择 TabFragment 中的第二个选项卡的任何提示?就像在每个选项卡上放置一个 Listener。 谢谢。

【问题讨论】:

    标签: android android-fragments android-viewpager android-toolbar android-tablayout


    【解决方案1】:

    您可以在 MainActivity 上注册 BroadCastReceive,当您选择第二个选项卡时向 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,它会让你对它有更深的了解

    【讨论】:

    • 关于如何做到这一点的任何模板代码?还是向导?感谢您的回复。
    【解决方案2】:

    好的,感谢 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多