Toolbar上動態顯示Menu

最常見的是我們app的主頁面是由Viewpager嵌套Fragment,但當我們需要在顯示不同Frragment的時候,Toolbar上的Menu也要隨之改變,我們總不能寫三個Toolbar跟三個Menu文件來實現吧,這樣也太low了。

first.png
second.png
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<Fragment> 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簡單使用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容