按下按钮时,我需要删除 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)
我发现了很多问题,但都没有解决。
我需要你的帮助。
答案 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的缺点是您无法将事务添加到反向堆栈中,以便稍后弹出),是预期的副作用,但一些开发人员并不经常知道它:)