SlidingMenu 和三星在弹出视图中打开(指定的孩子已经有父母。例外)

Posted

技术标签:

【中文标题】SlidingMenu 和三星在弹出视图中打开(指定的孩子已经有父母。例外)【英文标题】:SlidingMenu and Samsung open in pop-up view (The specified child already has a parent. Exception) 【发布时间】:2018-03-05 17:54:47 【问题描述】:

我对三星的“在弹出式视图中打开”选项有疑问。 我的应用程序使用 jfeinstein10/SlidingMenu 库(4 年内未更新),下面描述的问题仅影响使用它的活动。

SlidingMenu 与 android 的 DecorView 混为一谈,我知道(从下面的堆栈跟踪)三星的“在弹出视图中打开”使用了 DecorCaptionView,我认为这与 DecorView 有关。

问题在于,每次三星设备(即 Galaxy S7)上的用户按下“最近按钮”并将应用程序移动到“在弹出视图中打开”框时,如下图所示:

抛出以下异常:

Fatal Exception: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
   at android.view.ViewGroup.addViewInner(ViewGroup.java:4656)
   at android.view.ViewGroup.addView(ViewGroup.java:4497)
   at com.android.internal.widget.DecorCaptionView.addView(DecorCaptionView.java:358)
   at android.view.ViewGroup.addView(ViewGroup.java:4469)
   at com.android.internal.policy.DecorView.onConfigurationChanged(DecorView.java:2053)
   at com.android.internal.policy.PhoneWindow.onMultiWindowModeChanged(PhoneWindow.java:747)
   at android.app.Activity.dispatchMultiWindowModeChanged(Activity.java:7177)
   at android.app.ActivityThread.handleMultiWindowModeChanged(ActivityThread.java:3212)
   at android.app.ActivityThread.-wrap16(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1866)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6692)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

我的应用崩溃了。

经过一些代码调查,我发现这个 SlidingMenu lib 代码块导致了问题:

    case SLIDING_WINDOW:
        mActionbarOverlay = false;
        ViewGroup decor = (ViewGroup) activity.getWindow().getDecorView();
        ViewGroup decorChild = (ViewGroup) decor.getChildAt(0);
        // save ActionBar themes that have transparent assets
        decorChild.setBackgroundResource(background);
        decor.removeView(decorChild);
        decor.addView(this);
        setContent(decorChild);
        break;

但是当这个弹出窗口发生时我无法调试它。

有人对如何解决这个问题有任何建议吗?

我已经尝试在 AndroidManifest 中明确关闭三星的多窗口选项:

    <meta-data
        android:name="com.samsung.android.sdk.multiwindow.enable"
        android:value="false" />
    <meta-data
        android:name="com.samsung.android.sdk.multiwindow.multiinstance.enable"
        android:value="false" />
    <meta-data
        android:name="com.sec.android.multiwindow.STYLE"
        android:value="fixedRatio" />
    <meta-data
        android:name="com.sec.android.support.multiwindow"
        android:value="false" />

但没有成功。

【问题讨论】:

调用 removeAll 而不是 remove。 @DheerubhaiBansal 不工作,仍然崩溃 【参考方案1】:

您可以尝试以下两种解决方案:

    decor.addView(this);之后,添加这个块:

try 
  Field field = decor.getClass().getDeclaredField("mContentRoot");
  field.setAccessible(true);
  field.set(decor, this);
 catch (Exception e) 
  // do something

    android:resizeableActivity="false" 添加到AndroidManifest.xml 中的'application' 元素,以禁用多窗口。

【讨论】:

以上是关于SlidingMenu 和三星在弹出视图中打开(指定的孩子已经有父母。例外)的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS 4.0.x:在弹出视图中编辑网格

离子应用程序在弹出框和模式关闭后冻结或停止工作

在弹出窗口中呈现模态视图

如何打开Android设备的USB调试模式

iOS 在弹出窗口中显示视图控制器

android怎么导annotations.jar包