2012-01-30 5 views
10

Android 문서에서 조각을 사용하는 경우 example에서 애플리케이션이 '이중 뷰'모드 인 경우 애플리케이션이 다른 제목의 세부 정보를 표시해야 할 때마다 세부 정보 조각이 재생성됩니다. FragmentTransaction.replace()은 각각의 오래된 세부 프래그먼트 인스턴스를 새로운 인스턴스로 교체하는 데 사용됩니다.새 인스턴스를 만드는 대신 조각을 업데이트 하시겠습니까?

권장되는 방법입니까? 실제 의도 (아무 말도 의도하지 않음)가 UI 자체가 아닌 UI가 보여주는 것을 업데이트하는 것이면 새로운 UI 인스턴스를 만드는 것은 낭비가 아니십니까? 새 인스턴스를 만드는 유일한 이유는 사용자를 백 스택에 추가하여 사용자가 단계를 되돌릴 수 있기 때문입니다. 그렇지 않으면 조각을 직접 업데이트하는 것이 안전할까요?

예제의 경우, DetailsFragment.setShownIndex() 행을 따르는 메소드를 의미합니다. DetailsFragment을 재 작성하는 대신 새 제목 색인을 전달하여이를 호출합니다.

예를 들어 한 액티비티가 두 조각을 모두 관리하지만 한 번에 하나만 보여 주므로 필요에 따라 각 조각을 바꿔 넣는 예제가 있다고 가정 해 보겠습니다. 액티비티가 각 프래그먼트의 인스턴스를 만들고, 각각에 대한 참조를 유지 한 다음 필요에 따라이 두 인스턴스를 간단히 추가하거나 제거하는 것이 좋을까요?

제목 조각이 resumed 상태 (예 : '포 그라운드') 일 때 제목을 선택하면 세부 정보 조각이있는 시점에 DetailsFragment.setShownIndex()이 호출 될 수 있습니다. stopped 상태.

좋은 아이디어? 나쁜 생각?

미리 감사드립니다.

답변

5

새 Fragment 인스턴스를 만드는 주된 이유는 백 스택을 쉽게 사용할 수 있기 때문입니다. 또한 기존 조각을 재사용해도 안전합니다 (FragmentManager.findFragmentById() 또는 FragmentManager.findFragmentByTag()). 때로는 isVisible(), isRemoving() 등의 Fragment 메서드를 잘 활용해야하므로 DetailsFragmentstopped 일 때 불법적으로 UI 구성 요소를 참조하지 않아도됩니다. 2 개 조각과

제안 된 단일 창 활동에 어쨌든

, onCreateView 또는 onActivityCreated에로드 DetailsFragment에 개인 필드를 설정할 수 있습니다 당신의 setShownIndex 방법. DetailsFragment가 용기에 첨가 될때 DF가 새로 생성하거나 재사용 여부

예컨대, 두 경우

DetailsFragment df = getFragmentManager().findFragmentByTag("details"); 
if (df != null) { 
    df.setShownIndex(getSelectedIndex()); 
} else { 
    df = DetailsFragment.newInstance(getSelectedIndex()); 
} 
fragmentTransaction.replace(R.id.frame, df, "details").commit(); 

, onCreateViewonActivityCreated가 호출된다.

하지만 백 스택을 원한다면 새 인스턴스를 만드는 것이 좋습니다. 그렇지 않으면 DetailsFragment의 내용에 대한 자체 백 스택을 구현하는 것입니다.

0

나는 다음과 같은 코드를 시도하고 나를 위해 작동합니다 : 당신에게

을 도울 수있는 희망

public static boolean isFragmentInBackstack(final android.support.v4.app.FragmentManager fragmentManager, final String fragmentTagName) { 
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) { 
     if (fragmentTagName.equals(fragmentManager.getBackStackEntryAt(entry).getName())) { 
      return true; 
     } 
    } 
    return false; 
} 

다음 조각이 기능을 실행 StackBack에 이미있는 경우

private void replaceFragment(Class fragmentClass, String FRAGMENT_NAME, android.support.v4.app.FragmentManager fragmentManager) { 

    Fragment fragment = null; 
    String backStateName = fragmentClass.getName(); // nome della classe del Fragment 

    Log.d("Fragment: ", "Creazione Fragment: "+backStateName); 


    Boolean fragmentExit = isFragmentInBackstack(fragmentManager, backStateName); 


    if (fragmentExit) { //Il Fragment è presente nello stacback 

     // Fragment exists, go back to that fragment 
     //// you can also use POP_BACK_STACK_INCLUSIVE flag, depending on flow 
     fragmentManager.popBackStackImmediate(fragmentClass.getName(), 0); 

    } else { 

     // se non esiste lo aggiungiamo 
     try { 
      fragment = (Fragment) fragmentClass.newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Inizializzo la transazione del Fragment 
     android.support.v4.app.FragmentTransaction ft = fragmentManager.beginTransaction(); 
     ft.setCustomAnimations(
       R.anim.fragment_slide_left_enter, 
       R.anim.fragment_slide_left_exit, 
       R.anim.fragment_slide_right_enter, 
       R.anim.fragment_slide_right_exit); 
     ft.replace(R.id.frameLayout_contentMain, fragment, FRAGMENT_NAME); 
     ft.addToBackStack(fragmentClass.getName()); 
     ft.commit(); 

     // Recupero il numero di Fragment presenti 
     Integer nFragment = fragmentManager.getBackStackEntryCount(); 

     Log.d("Fragment: ", "Numero di Fragment: "+nFragment); 

    } 

} 

가 확인하려면

+0

영어로 의견을 보내 주시면 더 도움이됩니다. –

+0

죄송합니다. 이탈리아어입니다. –

관련 문제