2013-03-03 5 views
0

설명서에서 이해할 수있는 한 조각을 분리하고 나중에 다시 첨부하면 자동으로 분리 된 것처럼 보입니다. 그것보다 더 많은 것이 있습니까? 나는 2 개의 다른 조각을위한 2 개의 단추를 가진 간단한 활동 막대기가있다. 처음부터 두 번째를 첫 번째에서 두 번째로 전환하면 첫 번째 조각에로드 된 이미지가 더 오래 표시됩니다. 첨부/분리를 잘못 사용하고 있습니까? 아니면 instanceState를 직접 관리하고 UI를 다시 그려야합니까? 그렇다면 첨부 및 분리 방법의 핵심은 무엇입니까?FragmentTransaction.attach() 및 detach()를 사용하면 단편 ui가 유지되지 않습니다.

@Override 
public void onStart(){ 
    super.onStart();  
    ndi=new NasaDailyFragment(this); 
    bnf=new BreakingNewsFragment(this); 
    ft=getFragmentManager().beginTransaction(); 
    ft.add(R.id.focused_view_container,ndi).commit(); 

} 

public void onTabSelected(Tab tab, FragmentTransaction f) { 

switch(tab.getPosition()){ 
case 0: 
    ft=getFragmentManager().beginTransaction(); 
    if(!ndi.isAdded()){ 
     ft.replace(R.id.focused_view_container, ndi).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit(); 
     ft.attach(ndi); 
     getFragmentManager().executePendingTransactions(); 
    } 

    break; 
case 1: 
     ft=getFragmentManager().beginTransaction(); 
     ft.detach(ndi); 
     ft.replace(R.id.focused_view_container, bnf).commit(); 
     getFragmentManager().executePendingTransactions(); 
    break; 
} 

} 기본적으로

답변

-1

Fragment는 사용자가 분리되면 다시 다음 첨부됩니다. Fragment에서 setRetainInstance(true)을 호출하여이 동작을 변경할 수 있습니다. 실제 인스턴스는 메모리에 보관되며 분리 연결 후 다시 생성되지 않습니다. 그러나 Fragment의 UI는 두 가지 방법으로 모두 삭제되고 이후에 다시 생성되므로 FragmentActivity에 다시 첨부 한 후 적절한 데이터로 조회수를 채워야합니다. 희망이 도움이됩니다.

+0

잘못되었습니다. [setRetainInstance()] (http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance%28boolean%29) 메소드가 다른 작업을 수행 중입니다 – kreker

+0

@kreker, " 프래그먼트 인스턴스는 활동 재 작성에서 유지됩니다. "- 감각이 다른가요? – Egor

+0

예, 문제는 첨부 - 분리 사이의 조각 상태에 대한 것이 었습니다. 작업 재 작성 – kreker

1

첨부 및 분리 대신 표시 및 숨기기를 사용하십시오. 다음은 샘플 코드,

private class MyTabListener implements ActionBar.TabListener { 
    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 

     switch (tab.getPosition()) { 
     case 0: 

      if (frag1 == null) { 
       // If not, instantiate and add it to the activity 
       frag1 = Fragment.instantiate(getApplicationContext(), 
         FeedsActivity.class.getName()); 
       ft.add(android.R.id.content, frag1, "Feeds"); 
      } else { 
       // If it exists, simply attach it in order to show it 
       ft.show(frag1); 
      } 
      return; 

     case 1: 
      if (frag2 == null) { 
       // If not, instantiate and add it to the activity 
       frag2 = Fragment.instantiate(getApplicationContext(), 
         ProfileActivity.class.getName()); 
       ft.add(android.R.id.content, frag2, "Profile"); 
      } else { 
       // If it exists, simply attach it in order to show it 
       ft.show(frag2); 
      } 
      return; 
     case 2: 

      if (frag3 == null) { 
       // If not, instantiate and add it to the activity 
       frag3 = Fragment.instantiate(getApplicationContext(), 
         History.class.getName()); 
       ft.add(android.R.id.content, frag3, "History"); 
      } else { 
       // If it exists, simply attach it in order to show it 
       ft.show(frag3); 
      } 

      return; 

     } 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
     if (frag1 != null) { 
      // Detach the fragment, because another one is being attached 
      switch (tab.getPosition()) { 
      case 0: 
       ft.hide(frag1); 
       return; 
      case 1: 
       ft.hide(frag2); 
       return; 
      case 2: 
       ft.hide(frag3); 
       return; 

      } 

     } 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 
    } 
} 
+0

질문에 대답하지 않고 첨부 및 분리 대상은 무엇입니까? –

+0

@BasimSherif 이것이 나를 위해 작동하지 않습니다. 나는 ActionBarSherlock을 사용하고있다. – SayeedHussain

+0

@BasimSherif 당신이 말하는 'frag1'은 무엇입니까? – Si8

0

당신 논리에 문제가있다 - 당신이이 중복, 대체 다음을 첨부하거나 경우 1 분리에 다시 다음 조각을 대체합니다. 옆으로 당신이 탭을 전환 할 때마다 오래된 조각을 파괴 대체합니다. 차라리 이런 식으로 갈 것 :

public void onTabSelected(Tab tab, FragmentTransaction f) { 
    switch(tab.getPosition()){ 
    case 0: 
     if(ndi.isAdded()){ 
      f.detach(bnf); 
      f.attach(ndi); 
     }else{ 
      f.add(R.id.focused_view_container, ndi).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     } 
    break; 
    case 1: 
     if(bnf.isAdded()){ 
      f.detach(ndi); 
      f.attach(bnf); 
     }else{ 
      f.add(R.id.focused_view_container, bnf).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     } 
    break; 
} 

을 그리고 당신은 통과하여 FragmentTransaction OnTabSelected 이벤트에 커밋 호출 할 필요가 없습니다.