根据ViewPager Android显示菜单项
我的Android应用程序中有一个带有片段的ViewPager。我想根据ViewPager的片段显示操作栏菜单项。我已经阅读了一些关于这个的问题,但是我找不到正确的解决方案。我的ViewPager代码如下:根据ViewPager Android显示菜单项,android,android-actionbar,android-viewpager,menu-items,Android,Android Actionbar,Android Viewpager,Menu Items,我的Android应用程序中有一个带有片段的ViewPager。我想根据ViewPager的片段显示操作栏菜单项。我已经阅读了一些关于这个的问题,但是我找不到正确的解决方案。我的ViewPager代码如下: public class My_Activity extends ActionBarActivity { private ViewPager mViewPager; String idioma; @Override protected void onCre
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时,我希望显示菜单项图标。确定..您必须使用在哪里监视方法onPageSelected(),该方法将在您更改ViewPager页面时触发。您必须跟踪当前页面,并在每次调用onPageSelected()时向发送一个调用。此InvalidateOptions功能表()是使其工作的关键,它将负责触发选项菜单的“刷新”。将间接调用OnCreateOptions功能表()的方法将被调用,并且您有机会根据所选选项卡“隐藏”或“显示”不同的项目集 例如:
public boolean onCreateOptionsMenu(Menu menu) {
///
if (currentPageIdx == 4) {
// inflate menu for page 4
// configure the menus
} ....
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);
}
}
首先在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()
活动菜单 设置主菜单,排除与片段相关的菜单项。 即 片段1代码
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
try {
inflater.inflate(R.menu.menu_asset, menu)
} catch (e: NullPointerException) {
e.printStackTrace()
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.action_add_asset) {
startNewActivity(NewAssetActivity::class.java)
return true
} else if (id == R.id.action_edit_asset_type) {
startNewActivity(AssetTypeActivity::class.java)
return true
}
return false
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
try {
inflater.inflate(R.menu.menu_liability, menu)
} catch (e: NullPointerException) {
e.printStackTrace()
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.action_add_liability) {
startNewActivity(NewLiabilityActivity::class.java)
return true
} else if (id == R.id.action_edit_liability_type) {
startNewActivity(LiabilityTypeActivity::class.java)
return true
}
return false
}
片段2代码
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
try {
inflater.inflate(R.menu.menu_asset, menu)
} catch (e: NullPointerException) {
e.printStackTrace()
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.action_add_asset) {
startNewActivity(NewAssetActivity::class.java)
return true
} else if (id == R.id.action_edit_asset_type) {
startNewActivity(AssetTypeActivity::class.java)
return true
}
return false
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
try {
inflater.inflate(R.menu.menu_liability, menu)
} catch (e: NullPointerException) {
e.printStackTrace()
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.action_add_liability) {
startNewActivity(NewLiabilityActivity::class.java)
return true
} else if (id == R.id.action_edit_liability_type) {
startNewActivity(LiabilityTypeActivity::class.java)
return true
}
return false
}
使用查看页面在片段之间滑动时,菜单将自动更改
使用orderInCategory显示菜单的正确顺序
不需要其他任何东西,您不需要隐藏/显示任何东西。您可以实现OnPageChangeListener,并且可以在onPageSelected函数中执行任何您想执行的操作。我已经用OnPageChangeListener更新了我的代码,但是我如何在其中创建菜单?Thanks通过调用InvalidateOptions菜单函数OnCreateOptions菜单将在此处调用,您可以根据可视页面对菜单进行充气通过调用InvalidateOptions菜单函数OnCreateOptions菜单将在此处调用,您可以根据可视页面对菜单进行充气,如下图所示MenuInflater=getMenuInflater();充气机。充气(右菜单。菜单,菜单);对不起,我英语说得不太好,我要打电话到哪里?你能给出示例代码吗?对不起,我已经用onPageChangeListener更新了我的代码,但是我如何在其中创建菜单呢?感谢您必须创建onCreateOptions菜单()方法..即创建菜单的方法…在onPageSelected()上,您只需调用:invalidateOptions菜单();其余的逻辑将在onCreateOptions菜单()上运行,如我的示例中所述。OnPrepareOptions菜单和addOnPageChangeListener-是否有人比另一个更好,或者他们是相同的。。。
setHasOptionsMenu(true);
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
try {
inflater.inflate(R.menu.menu_asset, menu)
} catch (e: NullPointerException) {
e.printStackTrace()
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.action_add_asset) {
startNewActivity(NewAssetActivity::class.java)
return true
} else if (id == R.id.action_edit_asset_type) {
startNewActivity(AssetTypeActivity::class.java)
return true
}
return false
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
try {
inflater.inflate(R.menu.menu_liability, menu)
} catch (e: NullPointerException) {
e.printStackTrace()
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
if (id == R.id.action_add_liability) {
startNewActivity(NewLiabilityActivity::class.java)
return true
} else if (id == R.id.action_edit_liability_type) {
startNewActivity(LiabilityTypeActivity::class.java)
return true
}
return false
}