2016-09-25 6 views
8

내 Fragment에 사용자 지정 키보드를 추가 했으므로 이제 다시 누를 때 키보드 닫기를 구현하고 싶습니다. 화면이 회전 할 때 내가 public void onActivityCreated(final Bundle savedInstanceState)BackstackEntry를 BackStack에 추가하지 않는 방법

fragmentPopped=false마다에 CustomKeyboard을 만들 수 있기 때문에 CustomKeyboard이 한 번 이상 가기 backstack에 추가 할 수 있도록

class CustomKeyboard 
{ 
    public void init(Context context) { 
     //... 

     FragmentManager fragmentManager = ((Activity) context).getFragmentManager(); 
     boolean fragmentPopped = fragmentManager.popBackStackImmediate(TAG, 0); 
     if (!fragmentPopped) { 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.addToBackStack(TAG); 
      fragmentTransaction.commit(); 
     } 
    } 
} 

문제는 init 호출 할 때마다입니다.

내 질문 :
이 가능하지가 getBackStackEntryCount() 방법을 사용하지 않고있는 경우 BackStackEntry이 가기 backstack에 추가하려면?

+0

https://developer.android.com/ reference/android/app/FragmentManager.html # POP_BACK_STACK_INCLUSIVE –

+0

직접 질문에 답변하거나 여러 통화 문제를 해결 하시겠습니까? – Elltz

+0

@Elltz 내 질문에 직접 대답하고 싶습니다. –

답변

2

아래 업데이트 된 코드를 사용해보십시오.

public void init(Context context) { 

    FragmentManager fragmentManager = ((Activity) context).getFragmentManager(); 
    boolean fragmentPopped = fragmentManager.popBackStack(TAG, 0); 
    if (!fragmentPopped) { 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.addToBackStack(TAG); 
     fragmentTransaction.commit(); 
    } 
} 
2

희망이

@Override 
public void replaceFragment (Fragment fragment, String backStackTag){ 
    AppAndroidUtils.hideKeyboard(this); 

    if(StringUtils.isEmpty(backStackTag)) 
     backStackTag = fragment.getClass().getName(); 
    FragmentManager manager = getSupportFragmentManager(); 
    boolean fragmentPopped = manager.popBackStackImmediate(backStackTag, 0); 

    if (!fragmentPopped && manager.findFragmentByTag(backStackTag) == null){ 
     FragmentTransaction ft = manager.beginTransaction(); 
     ft.replace(R.id.frame_container, fragment, backStackTag); 
     ft.addToBackStack(backStackTag); 
     ft.commit(); 
    } 

} 
2

당신이 뭔가를 할 수있는이 코드 도움말 :

또한
 FragmentManager fm= getSupportFragmentManager(); 

    if(fm!=null && getSupportFragmentManager().getFragments()!=null) { 

     boolean fragmentPopped = fm.popBackStackImmediate(TAG, 0); 

     if (!fragmentPopped && getSupportFragmentManager().getFragments().size() == 0) { 

      FragmentTransaction ft = fm.beginTransaction(); 
      ft.addToBackStack(TAG); 
      ft.commit(); 
     } 
    } 

당신은 다음과 같이 먼저 가기 backstack를 청소 한 다음 조각을 대체 할 수

private void cleanBackStack() { 
    FragmentManager fm = getSupportFragmentManager(); 
    if (fm != null && fm.getFragments() != null) { 
     if (fm.getFragments().size() > 1) { 

      for (int entry = 0; entry < fm.getFragments().size(); entry++) { 
       fm.popBackStackImmediate(); 
      } 
     } else if (fm.getFragments().size()==1){ 

      fm.popBackStack(); 
     }else if(fm.getFragments().size()==0){ 
       //REPLACE YOUR FRAGMENT 
     } 
    } 
}