Show menu items depending ViewPager Android

2019-04-01 11:38发布

I have a ViewPager with fragments in my Android app. I want to show Action Bar menu item depending the fragment of the ViewPager. I have readen some questions about this but I can´t find the correct solution. My ViewPager´s code is this:

    public class My_Activity extends ActionBarActivity  {

        private ViewPager mViewPager;
        String idioma;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_main);


            ActionBar actionBar = getSupportActionBar(); // || getActionBar();
            actionBar.setIcon(getResources().getDrawable(R.drawable.navbar_logo));
            actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#CC3333")));

            actionBar.setTitle("Hello");



             mViewPager = (ViewPager) findViewById(R.id.viewpager);
             PagerTabStrip pagerTabStrip = (PagerTabStrip) findViewById(R.id.pagerTabStrip);
             pagerTabStrip.setTabIndicatorColor(getResources().getColor(R.color.blanco));


             Title_Liga_Adapter titleAdapter = new Title_Liga_Adapter(getSupportFragmentManager());
             mViewPager.setAdapter(titleAdapter);

             mViewPager.setCurrentItem(0);

             getSupportActionBar().setIcon(R.drawable.navbar_logo);

             getSupportActionBar().setDisplayHomeAsUpEnabled(true);


            }


     @Override
public boolean onCreateOptionsMenu(Menu menu) {
if (mViewPager.getCurrentItem()==4){
    getMenuInflater().inflate(R.menu.menu_comunidad, menu);
}
else{

}
      return true;  
}


/* *
 * Called when invalidateOptionsMenu() is triggered
 */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    menu.findItem(R.id.action_search).setVisible(true);


    return super.onPrepareOptionsMenu(menu);
}

 public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
           this.finish();
           return true;

        case R.id.action_search:

            return true;

         default:
                return super.onOptionsItemSelected(item);
            }
    }


    }

I want that when CurrentItem is 4 for example show menu items icons.

3条回答
相关推荐>>
2楼-- · 2019-04-01 12:02

First create addOnPageChangeListener in onCreate method

ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
           // ...

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            invalidateOptionsMenu();
        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
}

Then you override onCreateOptionMenu()

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    if (mViewPager.getCurrentItem()==0){
        menu.findItem(R.id.action_search).setVisible(true);
    } else if(mViewPager.getCurrentItem()==1){
        menu.findItem(R.id.action_search).setVisible(false);
    } else if(mViewPager.getCurrentItem()==2){
        // configure
    } else if(mViewPager.getCurrentItem()==3){
        // configure
    }
    return super.onCreateOptionsMenu(menu);
}
查看更多
beautiful°
3楼-- · 2019-04-01 12:15

OK..you will have to play with the ViewPager.OnPageChangeListener where you will monitor the method onPageSelected() that will be triggered whenever you change the page of the ViewPager. You will have to keep track of what is the current page AND dispatch a call to the ActivityCompat.invalidateOptionsMenu every time the onPageSelected() is called. This invalidateOptionsMenu() is the key to make it work, it will be responsible for triggering the 'refresh' of options menu..that will indirectly call the onCreateOptionsMenu() method will be called and you have the opportunity to 'hide' or 'show' a different set of items according to the selected tab.

For instance:

public boolean onCreateOptionsMenu(Menu menu) {
   ///

   if (currentPageIdx == 4) {
      // inflate menu for page 4
      // configure the menus
   } ....


  return super.onCreateOptionsMenu(menu);
}
查看更多
乱世女痞
4楼-- · 2019-04-01 12:18

I answer my own question:

@Override
        public boolean onCreateOptionsMenu(Menu menu) {

            getMenuInflater().inflate(R.menu.menu_comunidad, menu);

              return true;  
        }


        /* *
         * Called when invalidateOptionsMenu() is triggered
         */
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
            if (mViewPager.getCurrentItem()==4){
            menu.findItem(R.id.action_search).setVisible(true);
            }
            else{
                menu.findItem(R.id.action_search).setVisible(false);
            }
            return super.onPrepareOptionsMenu(menu);
        }

         public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                // Respond to the action bar's Up/Home button
                case android.R.id.home:
                   this.finish();
                   return true;

                case R.id.action_search:

                    return true;

                 default:
                        return super.onOptionsItemSelected(item);
                    }
            }
查看更多
登录 后发表回答