2013-11-27 2 views
2

휴대 전화가 회전 할 때 수업을 저장하고 싶습니다. 내 코드는 다음과 같습니다괄호에 객체 저장시 오류가 발생했습니다.

public class MainActivity extends FragmentActivity 
{   
    private MapCanvas mapCanvas = null;  

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     if(savedInstanceState == null) 
     { 
      this.mapCanvas = new MapCanvas(this); 
     } 
     else 
     { 
      this.mapCanvas = (MapCanvas)savedInstanceState.getSerializable("s"); 
     } 

     setContentView(this.mapCanvas); 
     this.mapCanvas.requestFocus();    
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) 
    {  
     super.onSaveInstanceState(outState);  
     outState.putSerializable("s", this.mapCanvas); 
    } 
} 

하지만 난 내 휴대 전화를 회전 할 때 내가 줄에 오류가 setContentView(this.mapCanvas);

내 MapCanvas은 다음과 같습니다

public class MapCanvas extends ImageView implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    .... 
} 

내 로그 채팅은 다음과 같습니다

11-27 20:09:37.969: W/dalvikvm(14743): threadid=1: thread exiting with uncaught exception (group=0x40187560) 
11-27 20:09:37.999: E/AndroidRuntime(14743): FATAL EXCEPTION: main 
11-27 20:09:37.999: E/AndroidRuntime(14743): java.lang.RuntimeException: Unable to start activity ComponentInfo{ir.pangan.yazdbakishni/ir.pangan.yazdbakishni.activities.MainActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2844) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.app.ActivityThread.access$1600(ActivityThread.java:121) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:947) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.os.Looper.loop(Looper.java:130) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.app.ActivityThread.main(ActivityThread.java:3768) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at java.lang.reflect.Method.invokeNative(Native Method) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at java.lang.reflect.Method.invoke(Method.java:507) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at dalvik.system.NativeStart.main(Native Method) 
11-27 20:09:37.999: E/AndroidRuntime(14743): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.view.ViewGroup.addViewInner(ViewGroup.java:1976) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.view.ViewGroup.addView(ViewGroup.java:1871) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.view.ViewGroup.addView(ViewGroup.java:1851) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:226) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:216) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.app.Activity.setContentView(Activity.java:1668) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at ir.pangan.yazdbakishni.activities.MainActivity.onCreate(MainActivity.java:37) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-27 20:09:37.999: E/AndroidRuntime(14743): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623) 
11-27 20:09:37.999: E/AndroidRuntime(14743): ... 12 more 
+0

내가 로그 캣 ... –

+0

@shylendra에서 오류를 알 수 있습니다 예, 위의 내 편집을 참조하십시오 – javadaskari

답변

2

컨트롤을 번들에 저장할 수 없습니다. 각 onCreate 호출에서 모든보기를 다시 만들어야하지만 해당 사용자 정의보기의 내부 상태를 저장할 수 있습니다. 이것은 또한 사용자 정의 생성자를 사용하여 복구 할 수 있습니다.

여기 내 예를 참조하십시오 여기

public class MapCanvas extends ImageView { 
    public MapCanvas(Context c, Bundle state) { 
     super(c); 
     recoverState(state); 
    } 

    public recoverState(Bundle state) { 
     if(state==null) { 
      return; 
     } 
     // read values... 
    } 

    public Bundle saveState(Bundle outState) { 
     // save whatever you want. 
    } 
} 

그리고 수정 된 활동 :

public class MainActivity extends FragmentActivity {   
    private MapCanvas mapCanvas = null;  

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mapCanvas = new MapCanvas(this, savedInstanceState); 

     setContentView(mapCanvas); 
     mapCanvas.requestFocus();    
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) {  
     super.onSaveInstanceState(outState);  
     mapCanvas.saveState(outState); 
    } 
} 
관련 문제