2014-03-19 3 views
2

앱 배경을 설정하면 메모리가 부족한 것 같습니다.
안드로이드 IllegalArgumentException : 응용 프로그램이 일정 기간 동안 배경 이었다면 틀린 상태 클래스

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.qingdaonews.bus/com.qingdaonews.activity.RealTime}: 
java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.view.View$BaseSavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/myviewpager. Make sure other views do not use the same id. 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2266) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316) 
    at android.app.ActivityThread.access$600(ActivityThread.java:150) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:213) 
    at android.app.ActivityThread.main(ActivityThread.java:5225) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:525) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
    at dalvik.system.NativeStart.main(Native Method) 
그것은 인해 view.In 사실의 동일한 ID에 보이는





, 아이디 'myviewpager는'에만 XML 파일 및 문제에 한 번 나타납니다 로그는 다음과 같다 앱이 백그라운드에서 다시 열릴 때만 발생합니다.


그리고 내 MainActivity 내가 활동을 시작할 때 하란 getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit(); 를 사용하여 교체 할 수있는 하나의 조각이있다.
'savedInstanceState'의 수퍼 메소드가 없으면 다른 것을 사용하지 않았습니다.

+0

확인합니다. 'savedInstanceState'가'null'이 아닐 때'super (savedInstanceState)'를 호출하고,'View'를 한 번 생성 한 다음, 레이아웃을 확장하고 초기화 할 때 수동으로 같은 ID로'View'를 추가하려고 시도하는 것일 수 있습니다. 어쨌든, 우리에게 코드를 공개하고 싶지 않다면 많은 것들을 추측 할 수 있습니다. – Drew

+0

@Drew 감사합니다. 내 savedStstState에서 "super.onSaveInstanceState (outState);"만 사용합니다. 그리고 수동으로 어떤 views.The 내 애플 리케이션의 MainActivity 하나만 있지만 몇 가지 정보를 표시하도록 바꿀 수있는 하나의 조각이 있습니다. 이러한 조각은 몇 가지 문제가 발생할 것인가? 고마워요! –

+0

이 메서드뿐만 아니라'onCreate (Bundle savedInstanceState) '를 확인하십시오.이 메서드는 Activity의 라이프 사이클 중에 레크리에이션의 마법이 발생하는 곳입니다. – Drew

답변

3

원인은 사용자의 조각이 다시 추가된다는 것입니다. 귀하의 코드는 다음과 같습니다

protected void onCreate(Bundle savedInstanceState){ 
    super(savedInstanceState);   
    ///... 
    getSupportFragmentManager().beginTransaction() 
     .replace(R.id.content_frame, fragment).commit(); 
} 

관련 FragmentManager 통화를 통해 savedInstanceState != null 경우 super(savedInstanceState)으로 복원됩니다, 모든 최선을 다하고 조각이 너무 복원 얻을. 대신, 당신의 조각이 이미 추가되어 있는지 확인, 그렇지 않은 경우 에만 추가 :

public class MyActivity extends Activity{ 

    private MyFragment myFragment;//extends Fragment 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //your stuff 
     FragmentManager fm = getFragmentManager(); 
     myFragment = (MyFragment) fm.findFragmentByTag(MyFragment.TAG); 
     if(myFragment == null){ 
      myFragment = new MyFragment(); 
      fm.beginTransaction() 
       .add(R.id.content_frame, myFragment, MyFragment.TAG) 
       .commit(); 
     } 
     //other stuff 
    } 
} 

그리고 당신의 MyFragment

이 태그는 다음과 같습니다 나를 위해로서 public static final String TAG = MyFragment.class.getSimpleName();

, 나는 그것이 좋은 발견 TAG 매개 변수가 제공된 Fragments를 추가하는 연습을합니다.

+0

대단히 감사합니다. 하지만 replace 메소드가 왜 조각을 다시 추가 할 수 있었는지 궁금합니다. –

+0

귀하의 신청 흐름이 귀하가 묘사 한 내용에서 아직 명확하지 않습니다. 따라서 제 가정이 잘못 될 수 있으므로 제공된 정보를 바탕으로 아무 것도 말할 수 없습니다. 대답에 제공된 접근 방식을 사용하고 ** 기존 요소의 모든 식별자를 ** 두 번 확인하는 것이 좋습니다. – Drew

+0

@MarshalChen 그 밖의 것이 없다면 ViewPager 생성을 담당하는 Activitiy 코드의 일부만 제공하십시오. – Drew

0

사용자 정의 영상 복원 (View.onRestoreInstanceState() 무시) As specified here의 복원을 시도하는 동안 낮은 메모리 조건 (개발자 설정 -> 활동 유지 안함)과 맞춤보기가 충돌하여이 문제가 발생했습니다. 조회수에는 중복 ID가 없었습니다.

조각이 복원되는 방식 (사용자 정의보기 포함)의 버그로 인해 복원 중에 런타임시 인스턴스 상태를 저장할 때 추가 된 것보다 다른보기가 추가되었습니다. (우리의 경우 사용자 정의보기의 읽기 쓰기 버전이 처음에 추가되었지만 조각을 복원하면보기의 읽기 전용 버전이 추가되었습니다.)

나는 안드로이드가 읽기 - 쓰기보기의 상태를 설정하려고합니다. 읽기 전용보기에서, 그리고 이것은 물건을 부순다.

안드로이드 4.4.4에서 관찰되었다하지만 우리가 없어 안드로이드 6.0.1

예외였다 : 당신이 번들 savedInstanceState``에서 오브젝트를 다시 작성하는 방법

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.package.name/com.package.name.VisitActivity}: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class com.package.name.view.CustomView$CustomViewState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/0x465127ed. Make sure other views do not use the same id. 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471) 
    at android.app.ActivityThread.access$900(ActivityThread.java:175) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:146) 
    at android.app.ActivityThread.main(ActivityThread.java:5602) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
    at dalvik.system.NativeStart.main(Native Method)