java.lang.IllegalStateException: фрагмент еще не был прикреплен Android Studio - PullRequest
0 голосов
/ 01 июля 2019

Мне нужно удалить просмотр сканирования QRCode при нажатии кнопки вот мой код:

 public void back() {
    if (binding.vpPager.getCurrentItem() == 1) {
        binding.vpPager.setCurrentItem(0);
    }
else
    {
      scanQRcodeFragment = new ScanQRcodeFragment();
      scanQRcodeFragment.removeFragmentReader();
    }
}         

Используемая функция:

public class ScanQRcodeFragment extends Fragment implements BarcodeReaderFragment.BarcodeReaderListener{
 public void removeFragmentReader() {
    FragmentManager supportFragmentManager = getChildFragmentManager();
    FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
    Fragment fragmentById = supportFragmentManager.findFragmentById(R.id.container);
    if (fragmentById != null) {
        fragmentTransaction.remove(fragmentById);
    }
    fragmentTransaction.commitAllowingStateLoss();
}}       

Когда я запускаю приложение, оно падает, и я получаю эту ошибку:

java.lang.IllegalStateException: фрагмент еще не был прикреплен. на android.support.v4.app.Fragment.instantiateChildFragmentManager (Fragment.java:2383)

Я нашел много вопросов с той же проблемой, но никто не решил мои.

Мне нужна ваша помощь, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Вы создаете новый экземпляр фрагмента перед его удалением; это не имеет смысла.

Ваш код должен быть (псевдокод) больше похож на:

public void back() {
    if (binding.vpPager.getCurrentItem() == 1) {
        binding.vpPager.setCurrentItem(0);
    }
else
    {
      // must remove the Fragment
      Fragment = f = fragmentManager.findFragmentByTag(QR_CODE_FRAGMENT_TAG);
      if (f != null && f.isAttached()) {
           fragmentManager
              .beginTransaction()
              .remove(f)
              .commit();
       } else {
           // Fragment is not attached, nothing to do here, you can remove this code.
       }
    }
}         

Примечание: Имейте в виду, что commitNowAllowingStateLoss() - опасная операция. В зависимости от того, что вы делаете, ваше состояние (иначе: транзакция) может быть потеряно , если контекст исчезает до того, как состояние обновляется, и действие уже сохранило свое состояние.

Что вам, вероятно, нужно, это commitNow(), потому что это не операция обратного стека (недостатком commitNow является то, что вы не можете добавить транзакцию в backstack для вставки ее позже), что является ожидаемым побочный эффект, но не часто известный некоторым разработчикам:)

0 голосов
/ 01 июля 2019

Вы пытаетесь удалить фрагмент, используя другой объект, который не создал его.scanQRcodeFragment = new ScanQRcodeFragment(); Здесь вы создаете экземпляр нового объекта, который не был добавлен, вам нужна ссылка на добавленный фрагмент, чтобы удалить его.

...