【问题标题】:java.lang.IllegalStateException: Fragment has not been attached yet Android Studiojava.lang.IllegalStateException: Fragment 尚未附加 Android Studio
【发布时间】:2019-07-01 22:37:52
【问题描述】:

按下按钮时我需要删除 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)

我发现了很多相同问题的问题,但没有人解决我的问题。

我需要你的帮助。

【问题讨论】:

  • Fragment 是否附加到R.id.container?
  • 你的意思是xml代码吗?
  • 是的。如果您使用getSupportFragmentManager() 添加了片段,则需要使用getSupportFragmentManager() 将其删除。
  • removeFragmentReader() 的代码之前有效,但是当我在下面提到的函数 back() 的另一个类中调用相同的函数时,我得到了这个问题。
  • 当您从不同的班级调用时,您正在使用一个新的引用,这就是为什么您不能用这个新的引用删除它。请检查答案。

标签: java android fragment


【解决方案1】:

您正在尝试使用尚未实例化它的不同对象来删除该片段。 scanQRcodeFragment = new ScanQRcodeFragment(); 此处实例化了一个未添加的新对象,您需要添加片段的引用才能将其删除。

【讨论】:

  • 这是正确的。您应该使用“标签”添加它们,然后通过标签找到它们(或者如果范围允许,则保留对片段的引用)。我会使用一个标签,然后检查它是否是通过 `findFragmentByTag("your tag") 添加的
【解决方案2】:

在删除之前实例化片段的新实例;这没有意义。

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

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 的缺点是您不能将事务添加到回栈以便稍后弹出它),这是一个预期的副作用,但一些开发人员并不经常知道 :)

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2020-04-28
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多