我的代码在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()
的替代,但都没有解决这个问题。
2条答案
按热度按时间uyhoqukh1#
该错误是由应用程序中稍后的代码引起的,由一个while循环引起,该循环旨在等待按钮被按下后退出。删除这个while循环解决了这个问题,并让片段按预期被删除。
rwqw0loc2#
尝试添加transaction.addToBackStack(null)以确保片段被完全删除
字符串