2016-07-15 3 views
0

Android 앱을 개발 중이며 이상한 문제가 있습니다. 앱이 백그라운드에서 사용자가 전화 언어를 변경하고 백그라운드에서 앱을 다시 시작한 다음 앱을 강제 종료합니다.앱 전화 언어를 변경하고 배경에서 다시 시작하면 충돌이 발생합니다.

이상한 것은 내가 영어에서 프랑스어로 언어를 변경할 때만 응용 프로그램이 작동하지만 프랑스어에서 영어 또는 다른 언어로 변경하는 동안 충돌이 발생하지 않고 작동한다는 것입니다. 아래의 오류 로그입니다 -

프로세스 : PID com.myapp : 17,745 java.lang.IllegalStateException : 활동 (android.support.v4.app.FragmentManagerImpl.enqueueAction에서 을 파괴하고있다 FragmentManager.java:1515) android.support.v4.app.BackStackRecord.commitInternal (BackStackRecord.java:638) at android.support.v4.app.BackStackRecord.commitAllowingStateLoss (BackStackRecord.java:621) android.support.v4.app .FragmentStatePagerAdapter.finishUpdate (FragmentStatePagerAdapter.java:162) android.support.v4.view.ViewPager.populate (ViewPager.j ava : 1177) android.support.v4.view.ViewPager.populate (ViewPager.java:1025) (android.support.v4.view.ViewPager.onMeasure (ViewPager.java:1545) android.view)에 있습니다. View.measure (View.java:18794) android.widget.RelativeLayout.measureChildHorizontal (RelativeLayout.java:715)에서 android.widget.RelativeLayout.onMeasure (RelativeLayout.java:461)에서 android.view.View에서에서 . 측정 android.view.View.measure에서 android.widget.RelativeLayout.onMeasure (RelativeLayout.java:461)에서 android.widget.RelativeLayout.measureChildHorizontal (RelativeLayout.java:715)에서 (View.java:18794) (전망 된 .java : 18,794)에 android.widget.LinearLayout.measureVertical android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1465) 에서 android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951) 에서 (LinearLayout.java : 748) android.widget.LinearLayout.onMeasure (LinearLayout.java:630에서 ) android.support.v4.widget.DrawerLayout.onMeasure에서 android.view.View.measure (View.java:18794) 에서 (DrawerLayout .java : 1075) android.view.View.measure (View.java:18794) android.windows.FrameLayout.o nMeasure (FrameLayout.java:194) android.support.v7.widget.ContentFrameLayout.onMeasure (ContentFrameLayout.java:135)에서 android.view.View.measure (View.java:18794)에서 android.view에서 . ViewGroup.measureChildWithMargins (ViewGroup.java:5951) android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1465)에서 android.widget.LinearLayout.measureVertical (LinearLayout.java:748)에서 android.widget.LinearLayout에서 . onMeasure (LinearLayout.java:630) android.view.View.measure (View.java:18794) android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951) at android.widget.FrameLayout.onMeasure (FrameLayout.java:194) android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951) 로이드에서 에서 android.view.View.measure (View.java:18794) 에서 . 위젯 .LinearLayout.android.view.View.measure에서 measureChildBeforeLayout android.widget.LinearLayout.onMeasure (LinearLayout.java:630)에서 android.widget.LinearLayout.measureVertical (LinearLayout.java:748)에서 (LinearLayout.java:1465) (android.widget.FrameLayout.onMeasure (FrameLayout.java:194) 에서 android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951) 에서 View.java:18794) 에서 com.android.internal.policy.PhoneWindow $ DecorView.onMeasure (PhoneWindow.java:2643) android.view.View.measure (View.java:18794)의 android.view.ViewRootImpl.performMeasure (ViewRootImpl.java:2100)의 at 및 android.view.ViewRootImpl.performTraversals에서 roid.view.ViewRootImpl.measureHierarchy (ViewRootImpl.java:1216) (ViewRootImpl.java:1452) android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1107)에서 로이드에서 . android.view.Choreographer.doCallbacks에서 android.view.Choreographer $ CallbackRecord.run (Choreographer.java:858) 에서 view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:6013) (Choreographer.java:670) 에서 android.view.Choreographer.doFrame (Choreographer.java:606) android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:844) android.os.Handler.handleCallback (Handler.java:739) 0 android.app.ActivityThread.main에서 android.os.Looper.loop (Looper.java:148) 에서 android.os.Handler.dispatchMessage (Handler.java:95) (ActivityThread.java:5417) 에서에서 com.android.internal.os.ZygoteInit.main에서 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) 에서 java.lang.reflect.Method.invoke (기본 방법) (ZygoteInit 된 .java : 616)

답변

0

이 중첩 조각에 대한 추가 지원 기능에서 출연 한 버그 것 같다.

기본적으로 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

당신이 장치의 언어를 변경하면 조각의 새로운 인스턴스를 생성하기 때문이고, 앱이 새로운 인스턴스를 찾습니다.

이 형식 예외를 피하기 위해 조각의 인스턴스를 목록에 저장해야합니다.

조각이 추가되는 코드를 제공하면 명확 해집니다.

관련 문제