Toolbar上动态显示Menu

最常见的是我们app的主页面是由Viewpager嵌套Fragment,但当我们需要在显示不同Frragment的时候,Toolbar上的Menu也要随之改变,我们总不能写三个Toolbar跟三个Menu文件来实现吧,这样也太low了。

Toolbar上动态显示Menu_第1张图片
first.png
Toolbar上动态显示Menu_第2张图片
second.png
Toolbar上动态显示Menu_第3张图片
third.png

那么怎么样才能实现起来简单能,办法肯定是有的,我们可不可以在Activity初始化的时候就把我们所要展示的所有Menu给初始化了,然后我们再通过监听Viewpager的滑动页面来对Menu进行显示隐藏呢?没错,就是这个思路。这样我们就只需布局一个Toolbar跟一个Menu文件即可,岂不快哉!

我们知道初始化Menu的常用两方法是onCreateOptionsMenu(Menu menu)onOptionsItemSelected(MenuItem item)前一个是创建Activity是回调方法用于填充Menu的布局,只会执行一次,后面的方法是我们处理Menu的item点击事件的,这些比较常用就不过多介绍了。下面我要介绍的方法是onPrepareOptionsMenu(Menu menu),该方法每显示一次或调起一次Menu都会回调该方法,这就是我们实现该需求的关键方法,我们可以在该方法中实现Menu显示隐藏的逻辑,再通过invalidateOptionsMenu()方法去刷新Menu从而回调onPrepareOptionsMenu(Menu menu),这就达到了我们想要的效果。

上面图片的布局及Menu文件都很简单,因此省略。下面是Activiy里面的详细代码:

  public class MainActivity extends BaseActivity {

      private List list = new ArrayList<>();
      private int index = 0;

      @InjectView(R.id.navigation)
      BottomNavigationView navigation;
      @InjectView(R.id.vp)
      ViewPager vp;

      private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

          @Override
          public boolean onNavigationItemSelected(@NonNull MenuItem item) {
              switch (item.getItemId()) {
                  case R.id.navigation_home:
                      index = 0;
                      reflushView();
                      return true;
                  case R.id.navigation_discover:
                      index = 1;
                      reflushView();
                      return true;
                  case R.id.navigation_talk:
                      index = 2;
                      reflushView();
                      return true;
              }
              return false;
          }

      };

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          ButterKnife.inject(this);

          initView();
      }

      private void initView() {

          setGestureFinishEnable(false);
          finishOthersActivity();

          setTitle("房间");

          list.add(new RoomFragment());
          list.add(new DiscoverFragment());
          list.add(new TalkFragment());

          navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

          vp.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
              @Override
              public Fragment getItem(int position) {
                  return list.get(position);
              }

              @Override
              public int getCount() {
                  return list.size();
              }
          });

          vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
              @Override
              public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

              }

              @Override
              public void onPageSelected(int position) {
                  index = position;
                  reflushView();
              }

              @Override
              public void onPageScrollStateChanged(int state) {

              }
          });
      }

      private void reflushView() {
          vp.setCurrentItem(index);
          navigation.getMenu().getItem(index).setChecked(true);
          invalidateOptionsMenu();
          switch (index){
              case 0:
                  setTitle(R.string.bottom_title_room);
                  break;
              case 1:
                  setTitle(R.string.bottom_title_discover);
                  break;
              case 2:
                  setTitle(R.string.bottom_title_talk);
                  break;
          }
      }

      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          getMenuInflater().inflate(R.menu.main, menu);
          return super.onCreateOptionsMenu(menu);
      }

      @Override
      public boolean onPrepareOptionsMenu(Menu menu) {
          MenuItem logout = menu.findItem(R.id.logout);
          MenuItem deleteAll = menu.findItem(R.id.deleteAll);
          switch (index){
              case 0:
                  logout.setVisible(true);
                  deleteAll.setVisible(false);
                  break;
              case 1:
                  logout.setVisible(false);
                  deleteAll.setVisible(false);
                  break;
              case 2:
                  logout.setVisible(false);
                  deleteAll.setVisible(true);
                  break;
          }
          return super.onPrepareOptionsMenu(menu);
      }

      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()){
              case R.id.logout:
                  finishAllActivity();
                  System.exit(0);
                  break;
              case R.id.deleteAll:
                  ProgressDialog.show(getCurrent());
                  break;
          }
          return super.onOptionsItemSelected(item);
      }

  }

如果有朋友对BottomNavigationView不熟悉的话,可以查看我的BottomNavigationView简单使用

你可能感兴趣的:(Toolbar上动态显示Menu)