android - 从 Fragment 添加项目到操作栏的选项菜单后发生崩溃,然后更改方向

标签 android android-layout android-fragments actionbarsherlock viewpagerindicator

我正在使用 ActionBarSherlockViewPagerIndicator将 fragment 显示为选项卡。其中一个 fragment 将项目添加到 ActionBar:

private String[] mapNames;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    // init an String array `mapNames` which is used when populating submenu
    // ...
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    inflater.inflate(R.menu.fragment_maps, menu);

    SubMenu mapNamesMenu = menu.findItem(R.id.map_names).getSubMenu();
    mapNamesMenu.clear();
    for (int i=0; i<mapNames.length; i++) {
        mapNamesMenu.add(1, i, Menu.NONE, mapNames[i]);
    }

    super.onCreateOptionsMenu(menu, inflater);
}

res/menu/fragment_maps.xml 我有

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/map_names"
        android:title="Maps"
        android:icon="@drawable/maps_32"
        android:showAsAction="always|withText">
        <menu>
            <item android:id="@+id/placeholder_maps" />
        </menu>
    </item>
</menu>

在我旋转手机之前一切正常。方向更改后,此菜单变得不可访问(单击图标时没有任何反应)。然后,如果我再次旋转手机,我会收到此错误:

FATAL EXCEPTION: main
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
at android.view.ViewRoot.setView(ViewRoot.java:532)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.view.Window$LocalWindowManager.addView(Window.java:424)
at android.widget.PopupWindow.invokePopup(PopupWindow.java:912)
at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:824)
at com.actionbarsherlock.internal.widget.IcsListPopupWindow.show(IcsListPopupWindow.java:226)
at com.actionbarsherlock.internal.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:129)
at com.actionbarsherlock.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:102)
at com.actionbarsherlock.internal.view.menu.ActionMenuPresenter.onSubMenuSelected(ActionMenuPresenter.java:273)
at com.actionbarsherlock.internal.view.menu.MenuBuilder.dispatchSubMenuSelected(MenuBuilder.java:263)
at com.actionbarsherlock.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:892)
at com.actionbarsherlock.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:510)
at com.actionbarsherlock.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:145)
at android.view.View.performClick(View.java:2494)
at android.view.View$PerformClick.run(View.java:9122)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3806)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

有什么解决办法吗?我正在使用 Android 2.3.6

编辑:参见 test repository

最佳答案

我认为,这是一个上下文问题。这就是发生 BadTokenException 的原因。

这个异常背后有很多可能性:

1) 可能是您在某些实际需要 YourActivity.this 或父 Activity 上下文的地方使用“this”作为上下文引用。

2) 从 log-cat 我猜,你正试图显示一个 Pop-up 窗口。

问题可能是,您显示弹出窗口的时间过早(即在 Activity 生命周期完成之前。)。 所以等到 Activity 生命周期完成。

要延迟显示弹出窗口,您可以引用此link .

简而言之,这个问题是由于以下用例引起的:

An activity's reference is passed to the some component (i.e. like Toast, alert dialog, pop-up etc), and activity destroyed but that component is still alive or trying to use destroyed activity's context.

所以请确保没有这样的情况。

希望这能给你一些解决问题的提示。

关于android - 从 Fragment 添加项目到操作栏的选项菜单后发生崩溃,然后更改方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13473165/

相关文章:

java - 如何检查响应是否为 xml 格式而不是 HTML?

android - 在 Android Studio 1.4.1 中使用 Nexus 10 模拟器忽略 layout-xlarge

android - 在 onSaveInstanceState 之后无法执行此操作 - DialogFragment

android - 如何在android中动态更改特定图像的imageview大小?

android - 如何在多个 Activity 处于 Activity 状态时关闭应用程序

android studio 3.2 无法解析 ':app@debug/compileClasspath' : Could not resolve com. android.support :appcompat-v7:27. 1.1 的依赖关系

android - android 中的 Activity 流程 A->B->C->A

android - 如何在android中的相对布局内安排两个线性布局?

java - 在 Activity 中单击按钮时在回收器 View 和 fragment 之间切换

java - 将 fragment 类作为参数传递