2014-06-09 2 views
0

두 조각이 있습니다. 조각에는 생성자에 setRetainInstance(true)이 있습니다.조각이 없을 때 View.onRestoreInstanceState가 호출되지 않음 setRetainInstance (true) (조각이 백 스택에있는 경우 이중 화면 방향 변경)

더블 스크린 플립을하고 뒤로 가기 키를 누르면, 상단 조각이 튀어 나오고 하단 조각이 보입니다. 하지만 아래쪽 단편보기에는 onRestoreInstanceState이 표시되지 않습니다.

setRetainInstance(true)을 제거하면 모든 것이 올바르게 작동합니다. 하지만 복수 스레드로 작업하려면 setRetainInstance(true)이 필요하므로 간단한 문제는 해결할 수 없습니다. :)

이 경우 onRestoreInstanceState을 호출하는 방법은 무엇입니까?

package com.example.saverestoreviewstate; 

import android.app.Activity; 
import android.app.Fragment; 
import android.content.Context; 
import android.os.Bundle; 
import android.os.Parcelable; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

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

     if (savedInstanceState == null) { 
      getFragmentManager().beginTransaction().replace(android.R.id.content, new Fragment1()).commit(); 
     } 
    } 

    public static class SaveRestoreView extends TextView { 

     public SaveRestoreView(Context context) { 
      super(context); 
     } 

     String value; 

     public void setValue(String value) { 
      this.value = value; 
      setText(value); 
     } 

     @Override 
     public Parcelable onSaveInstanceState() { 
      Bundle bundle = new Bundle(); 
      bundle.putParcelable("super", super.onSaveInstanceState()); 
      bundle.putString("value", value); 
      return bundle; 
     } 

     @Override 
     public void onRestoreInstanceState(Parcelable state) { 
      Bundle bundle = (Bundle)state; 
      super.onRestoreInstanceState(bundle.getParcelable("super")); 
      value = bundle.getString("value"); 
      setText(value); 
     } 
    } 

    public static class Fragment1 extends Fragment { 

     private static boolean firstRun = true; 

     public Fragment1() { 
      setRetainInstance(true); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      Context context = inflater.getContext(); 

      LinearLayout layout = new LinearLayout(context); 
      layout.setId(12); 
      layout.setOrientation(LinearLayout.VERTICAL); 

      SaveRestoreView saveRestore = new SaveRestoreView(context); 
      saveRestore.setId(128); 

      if (firstRun) { 
       saveRestore.setValue("*******save this string*******"); 
       firstRun = false; 
      } 

      layout.addView(saveRestore); 

      Button button = new Button(inflater.getContext()); 
      button.setText("Create 2nd fragment"); 
      button.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        getFragmentManager().beginTransaction().replace(android.R.id.content, new Fragment2()).addToBackStack(null).commit(); 
       } 
      }); 

      layout.addView(button); 

      return layout; 
     } 
    } 

    public static class Fragment2 extends Fragment { 

     public Fragment2() { 
      setRetainInstance(true); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      return new View(inflater.getContext()); 
     } 
    } 
} 

답변

0

그래서, 내가 수동으로 논리를 저장/복원 구현을 완료했습니다 여기

몇 가지 예제 코드입니다. 마이너스는 이미 존재하는 save \ restore를 끌 수 없기 때문에 onSaveInstance/ onRestoreInstance이 뷰에서 두 번 호출됩니다. 그것 자체로 불리지 않을 때를 제외하고 - 한때 B-라고 불린다).

SparseArray<Parcelable> savedState; 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     if (savedState != null) 
      view.restoreHierarchyState(savedState); 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     savedState = new SparseArray<Parcelable>(); 
     getView().saveHierarchyState(savedState); 
    } 
:

는 그냥 Fragment1 클래스에 추가 작동하도록

관련 문제