2014-04-04 2 views
1

하나의 액티비티가있는 애플리케이션을 개발했으며이 액티비티에는 서랍과 여러 조각이 여러 조각으로 나뉘어 있습니다. 다중 조각 인스턴스를 완벽하게 보여주는보기 페이저를 설정했습니다. 하지만 뷰 호출기 (중첩 된 조각)에서 다른 프래그먼트를 열면 해당 버튼이 눌려 졌을 때 전체 응용 프로그램이 닫히기 때문에 조각 관리자의 백 스택에서 자식 조각 관리자를 사용하므로 누를 때처럼 구현하고 싶습니다. 다시 오픈 이전의 단편이다안드로이드 뷰 호출기의 중첩 된 조각에 대한 백 스택 문제 발행일

내 코드는

pageAdapter = new MyPageAdapter(getChildFragmentManager(), Global.DatabaseHandler.DisplayTempleList(), activityType); 

     pager = (ViewPager) v.findViewById(R.id.pager); 
     pager.setAdapter(pageAdapter); 
     indicator = (TabPageIndicator) v.findViewById(R.id.indicator); 
     indicator.setViewPager(pager); 


     return v; 
    } 

// private List<Fragment> getFragments() { 
// 
//  List<Fragment> fList = new ArrayList<Fragment>(); 
//  //TempleLists = Global.DatabaseHandler.DisplayTempleList(); 
// 
//  for (TempleDetail templeDetail : TempleLists.Temple) { 
//   if (activityType == Global.About) { 
//    fList.add(new About_Fragment(templeDetail.temple_id, templeDetail.temple_name)); 
//   } else if (activityType == Global.DailyDarshan) { 
//    fList.add(new DailyDarshan_Activity(templeDetail.temple_id, templeDetail.temple_name)); 
//   } else if (activityType == Global.PhotoGallery) { 
//    fList.add(new PhotoGallery_Activity(templeDetail.temple_id, templeDetail.temple_name)); 
//   } 
//  } 
// 
//  return fList; 
// } 

    private class MyPageAdapter extends FragmentPagerAdapter { 
     private HashMap<Integer, Fragment> fragments; 
     private TempleList TempleLists; 
     private String ActivityType; 

     //public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) { 
     public MyPageAdapter(FragmentManager fm, TempleList templeList, String activityType) { 
      super(fm); 
      fragments = new HashMap<Integer, Fragment>(); 
      TempleLists = templeList; 
      ActivityType = activityType; 
     } 

     @Override 
     public Fragment getItem(int position) { 

      if (!fragments.containsKey(position)) { 
       Fragment fragment = new Sub_container(TempleLists.Temple.get(position).temple_id, 
         TempleLists.Temple.get(position).temple_name, ActivityType); 
       fragments.put(position, fragment); 
      } 

      return this.fragments.get(position); 
     } 

     @Override 
     public int getCount() { 
      return TempleLists.Temple.size(); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      //return TempleLists.Temple.get(position % TempleLists.Temple.size()).temple_name.toUpperCase(); 
      return TempleLists.Temple.get(position).temple_name.toUpperCase(); 
     } 
    } 

} 


other fragment 

     Fragment fragment = new FullImageActivity(); 

       FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
       transaction.add(R.id.sub_container, fragment); 
       transaction.addToBackStack(null); 
       transaction.commit(); 

       Bundle args = new Bundle(); 
       args.putInt(Global.Id, position); 
       args.putString(Global.TempleId, getArguments().getString(Global.TempleId)); 
       fragment.setArguments(args); 

내 다시 홍보 ESSID와는

@Override 
public void onBackPressed() { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    Log.i("-----------------", "---------------" + getFragmentManager().getBackStackEntryCount() + "---------"); 
    if (fragmentManager.getBackStackEntryCount() == 0) { 
     if (doubleBackToExitPressedOnce) { 

      super.onBackPressed(); 
      return; 
     } 
     this.doubleBackToExitPressedOnce = true; 
     Global.interstitial.loadAd(Global.adRequest); 
     Toast.makeText(this, "Press Again to Exit", Toast.LENGTH_SHORT).show(); 
    } else { 
     fragmentManager.popBackStack(); 
     removeCurrentFragment(); 
    } 
} 

답변

3

당신은 가기 backstack에 중첩 된 조각을 추가 할 필요가,

public void changePage(int id, Fragment frag) { 

    String backStateName = frag.getClass().getName(); 
    changePage(id, frag, backStateName); 
} 



public void changePage(int id, Fragment frag, String backStateName) { 

    imm.hideSoftInputFromWindow(backView.getWindowToken(), 0); 

    transaction = fragmentManager.beginTransaction(); 

    transaction.setCustomAnimations(R.animator.righttoleft_1, R.animator.righttoleft_2, R.animator.lefttoright_1, R.animator.lefttoright_2); 

    boolean fragmentPopped = fragmentManager.popBackStackImmediate (backStateName, 0); 

    if (!fragmentPopped){ //fragment not in back stack, create it. 

     transaction.replace(id, frag); 
     transaction.addToBackStack(backStateName); 
     transaction.commit(); 
     } 

} 

을 codde 및 활동에이 코드를 추가합니다.

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 


    if (fragmentManager.getBackStackEntryCount() > 1) { 
     Log.i("MainActivity", "popping backstack"); 
     fragmentManager.popBackStack(); 
    } else { 
     Log.i("MainActivity", "nothing on backstack, calling super"); 
     super.onBackPressed(); 
    } 
} 
+0

모호한 호출을 표시하는 getclass(). 둘 다 ... –

+1

문자열 형식으로 호출하는 클래스 이름을 사용할 수 있습니다. 이것은 조각의 백 스택 개념에서 조각을 식별하기위한 문자열 형식입니다 ----------------- -------------------------------------------- 사용하려는 경우 getclass()를 호출하면 this를 this와 같은 객체로 캐스팅 할 수 있습니다. ((Object) fragment) .getClass(); –

+0

잘 작동하지 않는다 .... 그 여전히 가까운 전체 앱 .. –