2013-04-26 1 views
0

나는 응용 프로그램이 있습니다. 그것은 단편을 사용하고 있습니다. 주 활동은 2 조각으로 시작됩니다.런타임에 추가 된 조각 유지

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.v(getTag(), "FRAG onCreate CALLED!"); 
    this.setRetainInstance(true); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

View view = inflater.inflate(R.layout.third_fragment, container, false); 
return view; 

문제는 내가 이해 할 수 없다는 것입니다 :

button.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Activity activity = getActivity(); 

      if (fragment3 == null) { 
       getFragmentManager() 
       .beginTransaction() 
       .add(R.id.fragment_content3, new ThirdFragment()) 
       .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 
       .commit(); 
     } 

ThirdFragment 클래스는 다음과 같습니다 : 이러한 조각 중 하나는 다음과 같이 런타임에 3'rd 조각을 추가하는 데 사용되는 버튼을 포함 액티비티가 다시 생성 될 때이 조각의 뷰가 제거되지 않게하는 방법. onCreate() 메서드를 오버라이드 (override)하려고 해, setRetainInstance (true)를 사용해도 무용지물입니다.

그래서, 내 질문은 :

을 유지하는 적절한 방법은 활동이 다시됩니다 때 제거되는 조각을 추가 (런타임에) 동적으로 무엇입니까?

답변

0

이 상황에서는 활동 상태에 대한 정보를 저장할 수있는 추가 콜백 메서드 (onSaveInstanceState())를 구현하여 활동 상태에 대한 중요한 정보가 보존되도록 할 수 있습니다.

시스템이을 호출하여 활동을 파괴에 취약하게 만듭니다. 시스템은이 메소드에 putString() 및 putInt()와 같은 메소드를 사용하여 활동에 대한 상태 정보를 이름 - 값 쌍으로 저장할 수있는 번들을 전달합니다. 그런 다음 시스템에서 응용 프로그램 프로세스를 중단하고 사용자가 활동으로 다시 이동하면 시스템에서 활동을 다시 작성하고 onCreate()onRestoreInstanceState() 번들을 전달합니다. 이 두 가지 방법 중 하나를 사용하면 번들에서 저장된 상태를 추출하고 활동 상태를 복원 할 수 있습니다. 복원 할 상태 정보가 없으면 전달 된 번들은 null입니다 (활동이 처음 생성 된 경우). Android Documentation

솔루션 :

그래서, 당신이 당신의 조각에 대한 정보를 유지하는 방법 onSaveInstanceState() 내부에만 번들을 가지고 조각 복잡한 객체이기 때문에, 당신은 번들 내부에 직접 저장할 수 없습니다.

제 제안은 onSaveInstanceState()을 대체하고 boolean 플래그를 사용하여 세 번째 조각을 부착해야하는지 (표시 할 수 있음) 나타냅니다. 곧, OnCreate() or onRestoreInstanceState()을 사용하고 번들을 가져 플래그를 읽을 수 있습니다.이 플래그에 따라 조각을 만들거나 만들지 않을 수 있습니다.