2016-09-25 74 views
8

我已將自定義鍵盤添加到我的Fragment中,現在我想要在按下後按下時實現關閉鍵盤。如何將BackStackEntry添加到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通話時屏幕旋轉,因爲我在public void onActivityCreated(final Bundle savedInstanceState)

每次fragmentPopped=false創建CustomKeyboard,因此可以加到CustomKeyboard到堆棧中一個以上的時間。

我的問題:
是否有可能加入到BackStackEntry如果堆棧中沒有使用 getBackStackEntryCount()方法存在?

+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(); 
     } 
    } 

,你也可以先清理堆棧中像這樣,然後更換您的片段:

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 
     } 
    } 
} 
相關問題