2013-11-27 2 views
3

방향 변경시 단편 손실과 관련하여 고민 중입니다. 처음에는 조각이 오리 엔테이션 변경에 잘 응답하는 것 같고 아무 것도 잘못되었습니다. 그러나 예외는 이전에 만들어진 조각으로 돌아갈 때입니다. 내 fragmenthandler 활동에서 확인하고 있기 때문에.단편의 안드로이드 방향 손실 조각

스위치 사례 대신 큰 if 문을 사용하기로 결정했는데, 이는 내 지식을 이해하기에 더 컸기 때문입니다. if 문을 올바르게 처리하고, 로그 문으로 디버깅 했으므로 아무 것도 잘못된 것 같습니다. 아래는 미리 사용되거나 새로운 것을 만드는 조각 처리를위한 코드입니다.

public void fragmentHandle(Fragment fl, Fragment fr, String tl, String tr) { 
    Fragment cFragLeft = manager.findFragmentById(R.id.fragment_left); 
    Fragment cFragRight = manager.findFragmentById(R.id.fragment_right); 

    Fragment checkLeft = manager.findFragmentByTag(tl); 
    Fragment checkRight = manager.findFragmentByTag(tr); 

    FragmentTransaction ft = manager.beginTransaction(); 

    if (cFragLeft != null && cFragRight != null && checkLeft != null 
      && checkRight != null) { 
     ft.detach(cFragRight).detach(cFragLeft).attach(fr).attach(fl) 
       .addToBackStack(null).commit(); 
    } else if (cFragLeft != null && cFragRight != null && checkLeft == null 
      && checkRight == null) { 
     ft.detach(cFragLeft).detach(cFragRight) 
       .add(R.id.fragment_left, fl, tl) 
       .add(R.id.fragment_right, fr, tr).addToBackStack(null) 
       .commit(); 
    } else if (cFragLeft != null && cFragRight != null && checkLeft == null 
      && checkRight != null) { 
     ft.detach(cFragLeft).detach(cFragRight).attach(fr) 
       .add(R.id.fragment_left, fl, tl).addToBackStack(null) 
       .commit(); 
    } else if (cFragLeft != null && cFragRight != null 
      && checkRight == null && checkLeft != null) { 
     ft.detach(cFragLeft).detach(cFragRight).attach(fl) 
       .add(R.id.fragment_right, fr, tr).addToBackStack(null) 
       .commit(); 
    } else { 
     ft.add(R.id.fragment_left, fl, tl).add(R.id.fragment_right, fr, tr) 
       .commit(); 
    } 
} 

방향을 변경 한 다음 이전에 저장된 조각 (첫 번째 if 문)으로 돌아가서 왼쪽 및 오른쪽 조각 모두에 빈 화면이 표시됩니다. 이는 케이스 1이 호출되었을 때만 발생합니다. 단편 관리자가 태그로 태그를 찾았음에도 불구하고 거기에있는 파편을 기억하지 않는 것 같습니다.

나는 또한 onCreate를 확인했으며 아래에 나와 있습니다.

protected void onCreate(Bundle savedInstanceState) { 
    // super.onCreate 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_fragment_handler); 

    if (savedInstanceState == null) { 
     fragmentHandle(nFragLeft, nFragRight, "menuMain", "main"); 
    } 

} 

완제품 용 버튼 설명이 포함되어 있습니다. onClickListeners를 사용하지 않고 xml onClick보다이 방법을 선호할지 여부는 확실하지 않습니다.

public void sendDestination(View v) { 
    nFragLeft = menudestFrag; 
    nFragRight = destFrag; 
    String tagLeft = "menuDestination"; 
    String tagRight = "destination"; 

    fragmentHandle(nFragLeft, nFragRight, tagLeft, tagRight); 
} 

이 문제를 해결할 수있는 방법이 있습니까? 방향을 변경 한 후에 만 ​​발생합니다.

답변

1

오리 엔테이션이 변경되면 활동이 다시 발생하기 때문에 이런 현상이 발생합니다.

(방향이 변경되었을 때 활동을 다시 방지) 당신은 매니페스트 android:configChanges="orientation|screenSize"을 추가하는이 문제를 해결할 수 :

<activity 
     android:name="com.example.MyActivity" 
     android:configChanges="orientation|screenSize" > 
    </activity> 
+0

을 나는 안드로이드 매니페스트를 변경하여 작업을 수행 할 수 있습니다 알고 있지만, 그 취급의 합법적 인 방법이 아니다 내 생각에 조각. 안드로이드가 네이티브 방향 처리를 사용하는 것을 막을뿐입니다. 안드로이드가 태그로 찾을 수있는 것처럼 보이기 때문에 조각을 검색하는 방법을 찾고 있습니다. 그러나 아직 특정 조각의 데이터를 저장하지 않은 것 같습니다. 조각 내에서 데이터를 보존 할 필요가 없어도 부착 및 분리 대신 조각을 제거하고 추가하면 데이터를 보존 할 수 없기 때문에 다른 해결 방법을 발견했습니다. – Dethrax

+0

그럼에도 불구하고 귀하의 솔루션을 시도했지만 즉시 문제가 있습니다. 동적 인 UI를 만들었습니다. 즉, 하나의 창에서 두 개의 창 (포트와 토지)으로 전환하고 그 반대의 경우도 마찬가지입니다. 이 솔루션을 사용하면 레이아웃이 변경되지 않으므로 다시 작성되지 않습니다. onCreateView를 통해 xml 레이아웃을 호출하고 있으므로이 솔루션이 나에게 적합하지 않다고 생각합니다./ – Dethrax

+0

감사합니다. 요점은 매우 좋습니다. 당신은 내 애플 리케이션에 문제가 발생합니다. 나는 당신을 위해 또 다른 제안이 있는데, 나는 tryit을하지는 않았지만 작동 할 것이라고 생각한다. [this] (http://developer.android.com/guide/topics/resources/runtime-changes.html) onconfigurationChange attach/add/마지막 조각을 뒷받침에서 repalce. 이 도움을 바랍니다. – ovluca

관련 문제