首页 文章

应用程序崩溃后更改手机语言并从后台重新启动

提问于
浏览
0

我正在开发一个Android应用程序,并面临一些奇怪的问题 . 当应用程序在后台和用户更改手机语言并从后台重新启动应用程序然后应用程序停止 .

奇怪的是,只有当我将语言从英语改为法语时,应用程序才会崩溃,但是当从法语改为英语或其他语言时,它会在没有任何崩溃的情况下发挥作用 . 下面是错误日志 -

进程:com.myapp,PID:17745 java.lang.IllegalStateException:Activity已在android.support.v4.app.BackStackRecord的android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1515)中销毁 . commitInternal(BackStackRecord.java:638)位于android.support的android.support.v4.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:621)android.support.v4上的android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:162) .v4.view.ViewPager.populate(ViewPager.java:1177)位于android.support.v4.view.ViewPager.populate(ViewPager.java:1025)的android.support.v4.view.ViewPager.onMeasure(ViewPager.java) :1545)在Android.widget.RedencyLayout.measureChildHorizontal(RelativeLayout.java:715)的android.view.Redout.DealLouout.onMeasure(RelativeLayout.java:461)的android.view.View.measure(View.java:18794) android.widget.R上android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)的.view.View.measure(View.java:18794)位于android.view.measure./调查问题上的android.view.measure(View.java:5951)上的android.view.measure.(测量 . 目录:测试:解决方案:解决方案:解决方法,可以在Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout)上安装详情(RelativeLayout.java:461) .java:1465)android.widget.Line中的android.widget.Linear.measureVertical(LinearLayout.java:748)android.view.View.measure(View.java:18794)的android.widget.LinearLayout.onMeasure(LinearLayout.java:630)在android.sview.View.measure(View.java:18794)的android.sview.View.measure(View.java:18794)的android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1075)处于android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) android.widget.FrameLayout.onMeasure(FrameLayout.java:194)在android.view.view.measure(View.java:18794)的android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) android.widget.LinearLayout.meas上android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)的.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) ureVertical(LinearLayout.java:748)位于android.view.measure.View.measure(View.java:18794)的android.widget.Linear.onMeasure(LinearLayout.java:630)android.view.ViewGroup.measureChildWithMargins(ViewGroup.java) :5951)android.widget.FrameLayout.onMeasure(FrameLayout.java:194)在android.view.vision.measure(View.java:18794)android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)at android .widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)位于android.view.View.View的android.widget.Linear.measureVertical(LinearLayout.java:748)android.widget.LinearLayout.onMeasure(LinearLayout.java:630) . 测量(View.java:18794)在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)的android.widget.FrameLayout.onMeasure(FrameLayout.java:194)com.android.internal.policy.PhoneWindow $ DecorView .onMeasure(PhoneWindow.java:2643)在android.view.vision.measure(View.java:18794)的android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100)android.v android.view.ViewRootImpl上的android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)上的android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452)的iew.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216)$ TraversalRunnable .run(ViewRootImpl.java:6013)在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:858)的android.view.Chopographer.doCallbacks(Choreographer.java:670)android.view.Choreographer.doFrame Choreographer.java:606)在android.view.Handler.dispatchMessage(Handler.java)的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:844)android.os.Handler.handleCallback(Handler.java:739) :95)在android.app.Looper.loop(Looper.java:148)的android.app.ActivityThread.main(ActivityThread.java:5417)at java.lang.reflect.Method.invoke(Native Method)at com . android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

2 回答

  • 0

    这似乎是出现了一个 bug 支持为嵌套片段添加的功能 .

    基本上,FragmentManager在与活动分离时最终会出现内部状态损坏 .

    在片段上试试这个:

    @Override
    public void onDetach() {
        super.onDetach();
        try {
            Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
            childFragmentManager.setAccessible(true);
            childFragmentManager.set(this, null);
    
        } catch (NoSuchFieldException e | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
    

    如果有效,请告诉我 .

    问候,

  • 0

    这是因为当您更改设备的语言时,会创建片段的新实例,并且应用程序会尝试查找新实例 .

    您需要将片段的实例存储在List中以避免此类型的异常 .

    如果您提供添加片段的代码,那么它将更加清晰 .

相关问题