2012-12-08 3 views
7

페이저없이 조각을 탐색하는 올바른 방법을 알아내는 데 문제가 있고 화면 방향의 구성 변경 중에 문제가 발생합니다. 표시/숨기기를 사용하여 조각을 볼 수 있고 기능적으로 만들었지 만 대신 분리/부착을 사용해야하는지 궁금합니다. 나는 또한 다시 스택에 물건을 추가하는 데 문제가 있고 나는 그것이 또한 쇼/숨기기의 사용으로 인한 것 같아요. Attach/detatch를 사용하는 것이 더 좋습니까? 아니면 마지막/현재 조각을 표시/숨기도록 뒤로 단추를 무시하는 방법이 있습니까?프래그먼트 분리/재 연결 대 표시/숨기기

동작 : 지도 조각과 목록 조각이 몇 가지 있습니다. 모든 것이 올바르게 시작되고 오리엔테이션이 변경되면 처음에는 작동합니다. 목록 뷰로 이동하면 올바르게 채워지지만 방향 변경시 목록에 데이터가없는 상태에서 다시 그려집니다. 지도보기도 다시 그려지고 내 호출기 제목 표시기 뒤에 표시됩니다. 누구든지이 문제를 해결하려면 올바른 방향으로 나를 가리켜 주실 수 있습니다. 나는 그것이 파편을 보여주고 숨기고있는 방식에 의한 것이라고 의심하고 있습니다.

여기에서 조각을 만들고 조각 관리자에 추가합니다. 나는 또한 표시/숨기기 부분을 표시했습니다.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map_frags); 
    mapViewContainer = LayoutInflater.from(this) 
      .inflate(R.layout.map, null); 

    setupFragments(); 
    showFragment(0); 
} 
public void setListData(String name) { 
    bName = name; 
    showFragment(1); 
} 
private void setupFragments() { 
    final FragmentManager fm = getSupportFragmentManager(); 
    final FragmentTransaction ft = fm.beginTransaction(); 
    mFragment1 = fm.findFragmentByTag("f1"); 
    if (mFragment1 == null) { 
     mFragment1 = new MenuFragment(); 
     ft.add(mFragment1, "f1"); 
     ft.hide(mFragment1); 
    } 
    mMapFragment = (MapFragment) getSupportFragmentManager() 
      .findFragmentByTag(MapFragment.TAG); 
    if (mMapFragment == null) { 
     mMapFragment = MapFragment.newInstance(0); 
     ft.add(R.id.fragment_container, mMapFragment, MapFragment.TAG); 
    } 
    ft.hide(mMapFragment); 

    myListFragment = (ListFrag) getSupportFragmentManager() 
      .findFragmentByTag(ListFrag.TAG); 
    if (myListFragment == null) { 
     myListFragment = new ListFrag(); 
     ft.add(R.id.fragment_container, myListFragment, ListFrag.TAG); 
    } 
    ft.hide(myListFragment); 

    frag = (frag) getSupportFragmentManager().findFragmentByTag(
      frag.TAG); 
    if (frag == null) { 
     bacFrag = new frag(); 
     ft.add(R.id.fragment_container, frag, frag.TAG); 
    } 
    ft.hide(bacFrag); 
    ft.commit(); 
} 

public void showFragment(int fragIn) { 
    final FragmentTransaction ft = getSupportFragmentManager() 
      .beginTransaction(); 
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
    if (mVisible != null) { 
     if (mVisible == mListFragment) { 
      ft.remove(mListFragment); 
     } else { 
      ft.hide(mVisible); 
     } 
    } 

    switch (fragIn) { 
    case 0: 
     ft.show(mMapFragment); 
     ft.commit(); 
     mVisible = mMapFragment; 
     break; 
    case 1: 
     mListFragment = (ListFragmentDisplay) getSupportFragmentManager() 
       .findFragmentByTag(ListFragmentDisplay.TAG); 
     Toast.makeText(this, "startListFrag", Toast.LENGTH_LONG).show(); 
     if (mListFragment == null) { 
      mListFragment = new ListFragmentDisplay(); 
      ft.add(R.id.fragment_container, mListFragment, 
        ListFragmentDisplay.TAG); 
     } 
     ft.show(mListFragment).commit(); 
     mVisible = mListFragment; 
     break; 
    case 2: 
     ft.show(myfragment).commit(); 
     mVisible = myfragment; 
     break; 
    case 3: 
     ft.show(frag).commit(); 
     mVisible = frag; 
     break; 
    } 
} 
+0

방향 변경시 활동이 재개되지 않게하려면 manifest에 android : configChanges = "orientation | keyboardHidden"을 추가하면됩니다. – Faizan

+0

Detach/Attach는 리소스를 비우는 반면 hide/show는 해제합니다. – Faizan

답변

4

귀하의 잘못이 아닙니다. 문제는 오리엔테이션이 변경되면 모든 활동이 삭제됨을 의미합니다. 추가 된 모든 조각까지도 마찬가지입니다. 따라서 그 안에있는 데이터는 유지되지 않습니다. android:configChanges="orientation|keyboardHidden"을 사용하지 않는 것이 좋습니다. 대신 모든 조각 setRetainInstance(true)을 설정하면 현재 코드에서 잘 작동합니다.

+0

하나의 화면에서 여러 조각이 작동하지 않습니다. 그러나 나는 포기하지 않고 다른 모든 것을 다시 만들었을 때 위의 내 문제를 해결했을 것입니다. – doubleA

+0

이것은 실제로 제목의 질문에 대답하지 않습니다. – zgulser

0

더 나은 지속성을 원할 경우 (예 : 공간 문제로 인해 활동이 일시적으로 삭제 된 경우) 조각의 상태를 onSaveInstanceState으로 저장해야합니다. setRetainInstance은 구성 변경이 곧 이루어질 때만 작동합니다.