我的Android应用中有一个带有片段的ViewPager。我想根据ViewPager的片段显示操作栏菜单项。我已经阅读了一些有关此问题,但找不到正确的解决方案。我的ViewPager的代码是这样的:
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);
}
}
}
例如,我希望CurrentItem为4时显示菜单项图标。
首先在onCreate方法中创建addOnPageChangeListener
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) {
}
});
}
然后您重写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);
}
我回答我自己的问题:
@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);
}
}
确定..您将必须使用ViewPager.OnPageChangeListener进行操作,您将在其中监视方法onPageSelected(),该方法将在您更改ViewPager的页面时触发。您将必须跟踪当前页面是什么,并在每次调用onPageSelected()时向ActivityCompat.invalidateOptionsMenu调度一次调用。此invalidateOptionsMenu()是使其起作用的关键,它将负责触发选项菜单的“刷新”。将间接调用onCreateOptionsMenu()方法,您将有机会进行“根据所选标签隐藏或显示不同的项目集。
例如:
public boolean onCreateOptionsMenu(Menu menu) {
///
if (currentPageIdx == 4) {
// inflate menu for page 4
// configure the menus
} ....
return super.onCreateOptionsMenu(menu);
}