2014-08-31 5 views
10

Google 문서에서 설계 한대로 탐색 창을 만들지 만 조각이 대체되지 않는 문제가 있습니다. http://developer.android.com/training/implementing-navigation/nav-drawer.html조각 거래가 빈보기를로드하지만 조각 회전 장치가 표시된 후 표시됩니다.

앱이 처음로드되면 기본 조각이로드됩니다. 서랍 목록의 다른 항목을 클릭하면 빈보기가됩니다. 그러나 장치 회전시 선택한 조각을로드합니다.

public void selectNavActivty(int position){ 
    // TODO Changing between the different screens selection 
    fragment = null; 
    switch (position) { 
     case 0: 
      fragment = OverLay.newInstance(); 
      break; 
     case 1: 
      fragment = Dummy.newInstance(); 
      break; 
     } 

    if(fragment != null) { 
     // attach added to handle viewpager fragments 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.replace(R.id.content_frame, fragment).attach(fragment) 
      .addToBackStack(null); 

     trans.commit(); 
     getFragmentManager().executePendingTransactions(); 
    } else { 
     Log.d("Drawer Activity","Error in creating Fragment"); 
    } 
} 
+1

동일한 문제가 있습니다. 그것은 일반적이지 않습니다. 그것은 20 회 시도 중 1 회 발생합니다. onActivityCreated가 만들어지면 뷰가 비어 있거나 뷰의 일부가 비어있을 수 있습니다. 바꾸기 대신 추가합니다. – apmartin1991

+0

@ apmartin1991 여기서 코드 스 니펫을 여기 어딘가에 제공 할 수 있습니까 (예 : gist.github.com). 근본 원인을 이해하기가 더 쉬울까요? (예를 들어, 원래 게시물에서 .attach()가 호출되었지만'executePendingTransactions()'를 호출 할 필요는 없습니다. 예를 들어, 우리는 당신의 문제에 대해 아무것도 모릅니다. –

+0

Konstantin Loginov - 여기에 내 질문에 대한 동일한 것입니다 http://stackoverflow.com/questions/34742360/fragment-transaction-loads-a-blank-view – apmartin1991

답변

5

탐색 메뉴 조각 트랜잭션의 경우 다음 방법을 사용합니다. 이렇게하면 조각이 추가되어 맨 위에 배치됩니다.

String name = "myFragment"; 
getSupportFragmentManager() 
.beginTransaction() 
.replace(R.id.content_frame, fragment, name) 
.commit(); 

attach() 함수를 찾습니다. 그것은 다른 프래그먼트 라이프 사이클을 따른다. 레이아웃 파일 framelayout이 보이는지 확인하십시오. 이 솔루션은, 당신을 위해 일 당신의 조각 코드와 함께 XML 코드를 공유하지 않는 경우

if(fragment != null) { 
     // attach added to handle viewpager fragments 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.replace(R.id.content_frame, fragment); 
     trans.addToBackStack(null); 
     trans.commit(); 
    } else { 
     Log.d("Drawer Activity","Error in creating Fragment"); 
    } 

:

0

는 다음과 같이 코드를 수정합니다.

+1

@Veedka의 대답을 복사하여 붙여 넣는 것이 아닌가요? –

0

조각을 추가하면 활동 상태에 추가되고 해당보기 이 정의 된 컨테이너보기에 추가됩니다. 그러나 조각이 아직 UI에 추가되지 않은 경우 아무 것도 첨부하지 않으면 이 표시됩니다. 조각 관리자에게 을 부착하기 만하면됩니다. 그러나 UI에있는 컨테이너 에 뷰가 이미 추가되었다가 연결 해제 된 경우 첨부하면 해당 컨테이너에 이 다시 표시됩니다. 마지막으로 조각보기를 일시적으로 삭제하고 향후 내부에서 상태를 잃지 않고 보기를 표시 및 구축하려는 경우 부착 및 분리를 사용할 수 있습니다.

https://stackoverflow.com/a/18979024/3329488

0

내 솔루션 단편 교체에 고유 한 태그의 모든 조각에 태그를하는 것입니다. 생성하는 동안 기본 조각에도 고유 한 태그를 할당해야합니다.. 보다 효율적인 방법은 동일한 조각을 다시 만들기 전에 조각을 식별하는 것입니다.

public void selectNavActivty(int position){ 
// TODO Changing between the different screens selection 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragment = fragmentManager.findFragmentById(R.id.content_frame); 
    String fragmentTag = null; 
    switch (position) { 
     case 0: 
      fragmentTag = "case0Tag"; // please change to better tag name 
      break; 
     case 1: 
      fragmentTag = "case1Tag"; // please change to better tag name 
      break; 
     default: 
      Log.d("Drawer Activity","Error in creating Fragment"); 
      return; 
    } 
    if (fragmentTag != null && !fragment.getTag().equals(fragmentTag)) 
    fragmentManager.beginTransaction().replace(R.id.content_fragment, fragment, tag).commit(); 
}