方向更改后出现 ActionItem
ActionItem appears after orientation change
我遇到了一个很奇怪的问题,我已经为此奋斗了好几天。我有两个片段 A
和 B
。
虽然 A
可见,但我 ActionItem
可见。在用 B
替换片段 A
时,我隐藏了 ActionItem
,它们是 onCreate()
中数据的过滤器(也在 onConfigurationChanged()
中尝试过)。它确实隐藏了。但是当方向变为横向时,此 ActionItem
会在操作栏中恢复。
可能是什么原因?
另一个有趣的事实是 ActionItem
正在 标准 java class 中恢复,称为 Looper
。它在那里 "loops" 几次然后恢复 ActionItem
。
现在是代码。这就是我在代表片段导航的 activity 中创建它的方式:
@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>
最后是我如何在 Fragment 的 B
中隐藏 ActionItem
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);
}
}
请记住,当方向改变时,整个 activity 都会重新绘制(即生命周期方法的连续回调)。
此外,fragments' lifecycle 与其宿主(activity)密切相关。
据我所知,您似乎将片段 A
隐藏在片段的 B
onCreate()
方法中。尝试在片段的生命周期方法中添加 Log.d (Tag, String)
方法以查看何时调用这些方法。
在您的片段内部设置了 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);
}
现在您无需处理 activity 中的菜单项。
希望对您有所帮助。
我已经自己解决了。问题是我在修改它的元素后没有保存 actionBar
的状态。
我只需要在每次修改项目后写setRetainInstance(true);
。
一如既往,解决方案很简单...
我遇到了一个很奇怪的问题,我已经为此奋斗了好几天。我有两个片段 A
和 B
。
虽然 A
可见,但我 ActionItem
可见。在用 B
替换片段 A
时,我隐藏了 ActionItem
,它们是 onCreate()
中数据的过滤器(也在 onConfigurationChanged()
中尝试过)。它确实隐藏了。但是当方向变为横向时,此 ActionItem
会在操作栏中恢复。
可能是什么原因?
另一个有趣的事实是 ActionItem
正在 标准 java class 中恢复,称为 Looper
。它在那里 "loops" 几次然后恢复 ActionItem
。
现在是代码。这就是我在代表片段导航的 activity 中创建它的方式:
@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>
最后是我如何在 Fragment 的 B
中隐藏 ActionItem
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);
}
}
请记住,当方向改变时,整个 activity 都会重新绘制(即生命周期方法的连续回调)。
此外,fragments' lifecycle 与其宿主(activity)密切相关。
据我所知,您似乎将片段 A
隐藏在片段的 B
onCreate()
方法中。尝试在片段的生命周期方法中添加 Log.d (Tag, String)
方法以查看何时调用这些方法。
在您的片段内部设置了 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);
}
现在您无需处理 activity 中的菜单项。
希望对您有所帮助。
我已经自己解决了。问题是我在修改它的元素后没有保存 actionBar
的状态。
我只需要在每次修改项目后写setRetainInstance(true);
。
一如既往,解决方案很简单...