java.lang.IllegalStateException:片段尚未附加Android Studio

时间:2019-07-01 12:42:32

标签: java android fragment

按下按钮时,我需要删除 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 :(得分:0)

您正尝试使用尚未实例化该片段的另一个对象删除该片段。 scanQRcodeFragment = new ScanQRcodeFragment();在这里实例化一个未添加的新对象,需要引用添加的片段以将其删除。

答案 1 :(得分:0)

您正在实例化片段的新实例,然后再将其删除;那没有道理。

您的代码应(伪代码)更像:

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()是危险的操作。如果您在状态更新之前上下文已消失并且活动已保存其状态,则根据您的操作,状态(aka:事务)可能会丢失

您可能想要的是commitNow(),因为这不是反向堆栈操作(commitNow的缺点是您无法将事务添加到反向堆栈中,以便稍后弹出),是预期的副作用,但一些开发人员并不经常知道它:)