2017-01-02 10 views
1

Для моего приложения некоторые фрагменты требуют, чтобы пользователь вводил контакт в диалоговом окне перед его показом. У меня есть класс BaseFragment, который распространяется на все мои другие фрагменты, которые сохраняются, если требуется булавка. Моя проблема прямо сейчас связана с кнопкой «назад», как будто пользователь пытается вернуться к фрагменту, для которого требуется, чтобы в нем сначала был показан диалог вывода.Android peek backstack без popping

В настоящее время я переопределяю onBackPressed(), в котором я хочу посмотреть назад, чтобы увидеть, какой фрагмент будет возобновлен, если popkackstack() был вызван, поэтому я могу проверить, должен ли отображаться диалог PIN-кода. Ниже мой текущий код, который popFragment возвращается нуль:

@Override 
public void onBackPressed() { 
    if(getSupportFragmentManager().findFragmentById(R.id.fragment_container) instanceof BaseFragment) { 
     BaseFragment frag = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container); 

     if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
      int index = getSupportFragmentManager().getBackStackEntryCount() - 1; 
      Log.e("Back stack", Integer.toString(index)); 
      FragmentManager.BackStackEntry backEntry = (FragmentManager.BackStackEntry) getSupportFragmentManager().getBackStackEntryAt(index); 

      BaseFragment popFragment = (BaseFragment) getSupportFragmentManager().findFragmentById(backEntry.getId()); 

      BaseFragment.checkAuth(this, frag, popFragment, new NavigationCallback((AppCompatActivity) this)); 
     } else { 
      super.onBackPressed(); 
     } 
    } else { 
     super.onBackPressed(); 
    } 
} 

Я проверил, если backEntry является недействительным и его нет. backEntry.getId() также возвращается со значением 1, поэтому я не уверен, почему findFragmentById() тогда null. Я также не думаю, что он должен делать с тем, как я показываю фрагменты, но вот мой код, который, как хорошо:

FragmentManager fragManager = mActivity.getSupportFragmentManager(); 
FragmentTransaction transaction = fragManager.beginTransaction(); 
transaction.replace(R.id.fragment_container, mFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

ответ

0

BackStackEntry идентификатор и идентификатор Fragment не имеют ничего общего друг с другом.

Я сделал что-то похожее на то, что вы делаете, используя теги. Опять же, тег BackStackEntry и теги Fragment не имеют ничего общего друг с другом; однако, используя одно и то же значение для обоих тегов, вы можете достичь своей цели.

String tag = ... 
FragmentManager fragManager = mActivity.getSupportFragmentManager(); 
FragmentTransaction transaction = fragManager.beginTransaction(); 
// tag is associated with fragment 
transaction.replace(R.id.fragment_container, mFragment, tag); 
// same tag is associated with back stack entry 
transaction.addToBackStack(tag); 
transaction.commit(); 

...

int count = fragmentManager.getBackStackEntryCount(); 
if (count > 0) { 
    FragmentManager.BackStackEntry topBackStackEntry = 
      fragmentManager.getBackStackEntryAt(count - 1); 
    String tag = topBackStackEntry.getName(); 

    if (tag != null) { 
     Fragment fragment = fragmentManager.findFragmentByTag(tag); 
     if (fragment != null) { 
      // we found the fragment 
      // you can also sanity-check here with fragment.isResumed() 
     } 
    } 
} 
+0

Вы столкнулись с проблемой, где нужно было несколько фрагментов с тем же тегом в backstack? Мне любопытно, будет ли генерировать случайное имя для тега. –

+0

Я только что создал соглашение о создании тегов, которые гарантировали бы, что они будут уникальными в любой мыслимой перестановке стека. В моем случае, просто использование имени класса фрагмента было достаточно из-за дизайна приложения. Генерация случайного тега должна работать, если вы можете гарантировать, что тег никогда не будет дублироваться в фоновом стеке. –

+0

Также в моем случае мне нужно было знать, был ли только один из четырех типов фрагментов, потому что, как и ваше приложение, им нужно было знать, была ли нажата кнопка «Назад». Поэтому большинство транзакций с фрагментами даже не указывали теги вообще. –