2017-09-30 2 views
1

이전에 조각을 처리했지만보기 호출기 및 tablayout을 사용하여 배열을 작성하고 해당 배열에서 조각을 반환하여 조각 상태를 유지할 수있었습니다.탐색보기 조각 및 자식 백스틱

하지만 이제는 조각 관리자를 사용하여 추가 및 바꾸기에 액세스 할 수 있지만 둘 다 발생 한 내용을 저장하지 않고 (즉, editText를 입력하여) 조각의 새 인스턴스를 만듭니다.

메뉴에서 탐색 할 때 생성 한 프래그먼트를 유지하거나 재사용하는 방법 (이러한 프래그먼트 중 일부는 자식 백 스택을 가지므로 뒤로 버튼은 내 주요 프래그먼트가 아닌 깊은 조각 만 가져야 함을 기억하십시오))

편집 해결

private void initNavigation(){ 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

    /* Initialize fragments for navigation drawer */ 
    fragments = new Fragment[]{ 
      new ProfileFragment(), 
      new StatsFragment()}; 

    /* Set selection of navigation item */ 
    nav_view = (NavigationView) findViewById(R.id.nav_view); 
    nav_view.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
        item.setChecked(true); 

        FragmentManager fragmentManager = getSupportFragmentManager(); 
        switch (item.getItemId()) { 
         case R.id.nav_routine: 
          if(fragmentManager.findFragmentByTag("TAG0") != null){ 
           Log.i("fm", "reloading profile frag"); 
           fragmentManager.beginTransaction().replace(R.id.content_main, 
             fragmentManager.findFragmentByTag("TAG0"), "TAG0"); 
          } else{ 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").commit(); 
          } 
          break; 
         default: 
          if(fragmentManager.findFragmentByTag("TAG1") != null){ 
           Log.i("fm", "reloading stats frag"); 
           fragmentManager.beginTransaction().replace(R.id.content_main, 
             fragmentManager.findFragmentByTag("TAG1"), "TAG1"); 
          } else{ 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[1], "TAG1").commit(); 
          } 
          break; 
        } 

        drawerLayout.closeDrawers(); 
        return true; 
       } 
      } 
    ); 
} 

현재 코드 : 내가보기 위해서는 저장 할에이 ID가 있어야합니다 것을 발견

가 (의미가). 또한 나는 내 이전 코드

nav_view.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
        item.setChecked(true); 

        FragmentManager fragmentManager = getSupportFragmentManager(); 
        switch (item.getItemId()) { 
         case R.id.nav_routine: 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").commit(); 
          break; 
         default: 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[1], "TAG1").commit(); 
          break; 
        } 

        drawerLayout.closeDrawers(); 
        return true; 
       } 
      } 
    ); 
+0

사용 onSaveInstanceState .. –

답변

0

임이 나누었다 질문에 명확하지 내 .replace의 일부와 .commit()를 사용하지 않는 한 어떻게 조각의 backState를 유지하고있다. 그것에서 떠날 때 당신이 Fragment의 데이터를 저장할 수있는 것처럼

Fragment mfragment=new Fragmentname();   

     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_container, mfragment); 
     String backStateName = mfragment.getClass().getName(); 
     if (position != 0) { 
      ft.addToBackStack(backStateName); 
     } 

     ft.commit(); 
0

나는 당신이 이미 약 SavedInstanceState을 알 것 같아요. 어쨌든 조각 트랜잭션을 사용하여 Activity에서 한 조각을 다른 조각으로 처리하는 동안 커밋하기 전에 addToBackStack(null)을 추가해야합니다. 그래서 거래는

fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").addToBackStack(null).commit(); 

처럼 그리고이처럼 ActivityonBackPressed 함수를 재정의해야합니다. 앞뒤로 메뉴에서 조각 사이를 탐색 할 때 글고 데이터를 재사용/저장을위한

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) 
     getSupportFragmentManager().popBackStack(); 
    else 
     super.onBackPressed(); 
} 
+0

는 내 말은, 내가 변경 어떤 유지해야합니다. 자식 조각 (깊은 조각)에 대해 getChildFragmentManager를 사용하여 각 주요 조각이 자체 스택을 가질 수 있습니다. – John