2016-09-25 3 views
8

Я добавил пользовательскую клавиатуру к своему фрагменту, и теперь я хочу реализовать закрывающуюся клавиатуру, когда нажимается назад.Как добавить 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 вызовов каждый раз, когда экран поворачивается, потому что я создаю CustomKeyboard в public void onActivityCreated(final Bundle savedInstanceState)

fragmentPopped=false каждый раз, так CustomKeyboard могут быть добавлены к BackStack более чем один раз.

Мой вопрос:
Можно ли добавить BackStackEntry к BackStack, если не существует без использования 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(); 
     } 
    } 

Также Вы можете очистить свой 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 
     } 
    } 
} 
Смежные вопросы