我正在尝试显示/隐藏操作栏中的项目,具体取决于哪些片段可见。
在我的MainActivity中,我有以下内容
/* Called whenever invalidateOptionsMenu() is called */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if(this.myFragment.isVisible()){
menu.findItem(R.id.action_read).setVisible(true);
}else{
menu.findItem(R.id.action_read).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
}
然而,这很有效,当设备旋转时会出现问题。旋转完成之后onPrepareOptionsMenu再次被调用,但是这次 this.myFragment.isVisible()返回false ...因此当片段清晰可见时隐藏菜单项(至于显示的是什么)在屏幕上。)
答案 0 :(得分:25)
根据Fragments API Guide,我们可以基于每个片段向操作栏添加项目,步骤如下:
创建一个包含菜单项的res/menu/fooFragmentMenu.xml
,就像通常用于标准菜单一样。
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/newAction"
android:orderInCategory="1"
android:showAsAction="always"
android:title="@string/newActionTitle"
android:icon="@drawable/newActionIcon"/>
</menu>
在FooFragment的onCreate方法的顶部,指示它有自己的要添加的菜单项。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
...
}
覆盖onCreateOptionsMenu,您将在其中对片段的菜单进行充气并将其附加到标准菜单。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fooFragmentMenu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
覆盖片段中的onOptionItemSelected,只有当主机Activity / FragmentActivity的相同方法看到它没有选择的大小时才会调用它。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.newAction:
...
break;
}
return super.onOptionsItemSelected(item);
}
答案 1 :(得分:0)
当您的片段附加到活动时,请尝试使用片段setRetainInstance(true);
。这样,您的片段将保留其当前值,并在设备旋转时调用生命周期。
答案 2 :(得分:-2)
编辑:这是一个快速而又脏的修复,请参阅下面的es0329's answer以获得更好的解决方案。
尝试将此属性添加到Android清单中的activity
标记:
android:configChanges="orientation|screenSize"