Android Fragments 我的片段不会从片段容器中删除,尽管片段替换工作正常

oyt4ldly  于 2023-11-19  发布在  Android
关注(0)|答案(2)|浏览(159)

我的代码在MainActivity中包含一个名为changeFragment()的方法,我使用它来替换和删除我的两个片段容器中的片段。当我尝试使用此方法将容器中的一个片段替换为另一个片段时,它可以工作,但当我尝试删除片段时,它不能工作。Logcat中没有显示任何错误,并且代码在我调用此方法后继续运行。但是片段的视觉效果并没有被移除,即使我不能再与片段中的按钮交互。
下面是我的changeFragment()方法:

public void changeFragment(String fragmentContainer, String fragmentRequested) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    if (Objects.equals(fragmentRequested, "None")) {
        // Find the fragment to remove
        Fragment fragmentToRemove;
        if (Objects.equals(fragmentContainer, "menu")) {
            fragmentToRemove = fragmentManager.findFragmentById(R.id.menucontainer);
        } else {
            fragmentToRemove = fragmentManager.findFragmentById(R.id.selectioncontainer);
        }

        if (fragmentToRemove != null) {
            transaction.remove(fragmentToRemove);
        }

        // If a fragment replacement is requested:
    } else {
        // Find the new fragment to replace the old one with
        Fragment fragmentToBeDisplayed = switch (fragmentRequested) {
            case "CardNumberSelection" -> FragmentCardNumberSelection.newInstance();
            case "GameCreation" -> FragmentGameCreation.newInstance();
            case "Guide" -> FragmentGuide.newInstance();
            case "PlayerSelection" -> FragmentPlayerSelection.newInstance();
            case "Settings" -> FragmentSettings.newInstance();
            case "TitlePage" -> FragmentTitlePage.newInstance();
            default -> null;
        };

        // Replace the old fragment with the new one
        assert fragmentToBeDisplayed != null;
        if (Objects.equals(fragmentContainer, "menu")) {
            transaction.replace(R.id.menucontainer, fragmentToBeDisplayed);
        } else {
            transaction.replace(R.id.selectioncontainer, fragmentToBeDisplayed);
        }
    }

    transaction.commit();
    if (fragmentManager.findFragmentById(R.id.menucontainer) == null) {
        findViewById(R.id.settingsmenu).setVisibility(View.VISIBLE);
        findViewById(R.id.guidemenu).setVisibility(View.VISIBLE);
    } else {
        findViewById(R.id.settingsmenu).setVisibility(View.INVISIBLE);
        findViewById(R.id.guidemenu).setVisibility(View.INVISIBLE);
    }
}

字符串
下面是从片段容器(menucontainer)中删除旧片段(FragmentGameCreation)的代码。这行代码位于MainActivity中的一个方法中:

changeFragment("menu","None");


这是我用来开始显示FragmentGameCreation的代码,当我单击标题页片段中的按钮时,它成功地将我的FragmentTitlePage替换为FragmentGameCreation。这段代码在我的FragmentTitlePage类中:

// Start Game
startGameButton.setOnClickListener(view -> {
   // Replace the title page fragment with the game creation fragment
   FragmentManager fragmentManager = requireActivity().getSupportFragmentManager();
   fragmentManager.beginTransaction().replace(R.id.menucontainer, frag, "menuTag").commit();
});


我已经使用调试器确保了所有预期的代码行都在运行,而且都在运行。
我还尝试在将FragmentGameCreation放入menucontainer之前全局创建FragmentGameCreation的新示例,并使用dindFragmentByTag()方法作为findFragmentByID()的替代,但都没有解决这个问题。

uyhoqukh

uyhoqukh1#

该错误是由应用程序中稍后的代码引起的,由一个while循环引起,该循环旨在等待按钮被按下后退出。删除这个while循环解决了这个问题,并让片段按预期被删除。

rwqw0loc

rwqw0loc2#

尝试添加transaction.addToBackStack(null)以确保片段被完全删除

if (fragmentToRemove != null) {
    transaction.remove(fragmentToRemove);
    transaction.addToBackStack(null); 
}

字符串

相关问题