我遇到了很多奇怪的问题,我已经和他打了好几天了。我有两个片段A
和B
。
虽然A
可见,但ActionItem
可见。在使用A
替换片段B
时,我隐藏ActionItem
,它们是onCreate()
中数据的过滤器(也在onConfigurationChanged()
中尝试过)。它隐藏起来了。但是当方向更改为横向时,此ActionItem
将在操作栏中恢复。
可能是什么原因?
同样有趣的是,ActionItem
正在名为Looper
的标准 java类中恢复。它在那里“循环”几次然后恢复ActionItem
。
现在的代码。这就是我如何在代表片段导航的活动中创建它:
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.global_filters, menu);
this.menu = menu;
invalidateOptionsMenu();
return super.onCreateOptionsMenu(this.menu);
}
global_filters.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".NavigationActivity">
<item android:id="@+id/action_filters"
android:title="Filters"
android:icon="@drawable/ic_filter_white"
android:orderInCategory="100"
app:showAsAction="ifRoom" />
</menu>
过滤器的项目已添加到onOptionsItemSelected(MenuItem item)
:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_filters:
menuItemView = findViewById(R.id.action_filters); // SAME ID AS MENU ID
popupMenu = new PopupMenu(this, menuItemView);
//if logined - show user. Else guest
if (state) {
popupMenu.inflate(R.menu.popup_filters_user);
} else {
popupMenu.inflate(R.menu.popup_filters_guest);
}
//....
}
popup_filters_user.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/filter_purchased_user"
android:title="Purchased"/>
<item
android:id="@+id/filter_price_user"
android:title="Price"/>
<item
android:id="@+id/filter_author_user"
android:title="Author"/>
<item
android:id="@+id/filter_difficulty_user"
android:title="Difficulty"/>
</menu>
最后我如何在片段ActionItem
B
中隐藏onCreate()
:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//....other logic
//hide action Item
View menuItemView = getActivity().findViewById(R.id.action_filters);
if (menuItemView != null) {
menuItemView.setVisibility(View.GONE);
}
}
答案 0 :(得分:1)
请记住,当方向改变时,重新绘制整个活动(即生命周期方法的连续回调)。
此外,fragments' lifecycle与其主持人(活动)密切相关。
从我可以看到,您似乎隐藏了片段A
B
方法中的片段onCreate()
。尝试在片段的生命周期方法中添加Log.d (Tag, String)
方法,以查看何时调用它们。
答案 1 :(得分:1)
片段内部onCreate方法集
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
然后通过覆盖
分别为每个片段创建选项菜单@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Add your menu entries here
super.onCreateOptionsMenu(menu, inflater);
}
现在您不需要处理活动中的菜单项。
希望这会对你有所帮助。
答案 2 :(得分:0)
我已经自己解决了这个问题。问题是我在修改其元素后没有保存actionBar
的状态。
我需要的是在每次修改项目后写setRetainInstance(true);
。
一如既往,解决方案很简单......