[英]How to replace Fragment from dialogFragment?
I'm trying to create a simple game that on, certain fragments, when the back button is pressed, it'll show a dialogFragment asking to exit, continue or retry the game. 我正在尝试创建一个简单的游戏,在某些特定片段上,当按下后退按钮时,它将显示一个dialogFragment,要求退出,继续或重试该游戏。 When the retry button is pressed, the current fragment, on the activity, should be replaced but I keep getting "Activity has been destroyed" error.
当按下重试按钮时,应替换活动上的当前片段,但我不断收到“活动已被破坏”错误。
OnBackPressed OnBackPressed
@Override
public void onBackPressed()
{
Fragment currentFragment = getFragmentManager().findFragmentById(android.R.id.content);
Bundle currentFragmentArguments = currentFragment.getArguments();
if (currentFragmentArguments != null)
currentPlayer = (Players)currentFragmentArguments.getSerializable("currentPlayer");
//if not on last fragment(fight) then check if can go back to last fragment
if (!currentFragment.getTag().contains("fight"))
{
// Is there more than one fragment saved(1 is main menu fragment) and is player 1?
// Player 2 can only go back when drawing
if (getFragmentManager().getBackStackEntryCount() > 1 &&
(currentPlayer == null || currentPlayer.equals(Players.p1)))
{
getFragmentManager().popBackStack();
}
//Player 2 can't go back if picking weapon
else if (currentFragment.equals(Players.p2)
&& !currentFragment.getTag().contains("weapon"))
{
getFragmentManager().popBackStack();
}
else
{
//show to exit or go back to main menu
ShowDialog(); //<-- This is the important part
}
}
else
{
ShowDialog(); //<-- This is the important part
}
}
ShowDialog 显示对话框
@Override
public void ShowDialog()
{
Dialog d = new Dialog();
d.SetDialogTitle("About to exit...");
d.show(getFragmentManager(), "pauseDialog");
}
Restart button listener (Located on the dialogFragment) 重新启动按钮侦听器(位于dialogFragment上)
restartBtn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
dialogStateTxt = DialogStates.Restart.toString();
dismiss();
Main main = new Main();
main.RestartGame();
}
});
RestartGame 重新启动游戏
@Override
public void RestartGame()
{
MainMenuFragment mainMenuFragment = new MainMenuFragment();
fragmentConfig.ReplaceFragment(mainMenuFragment, android.R.id.content,
getFragmentManager(), mainMenuFragment.GetTag(), false);
}
ReplaceFragment (This is where the error is fired) ReplaceFragment(这是引发错误的地方)
public void ReplaceFragment(Fragment fragment, int contentId, FragmentManager fragmentManager,
String fragmentTag, boolean shouldAddToBackStack)
{
fragmentTrans = fragmentManager.beginTransaction();
if (shouldAddToBackStack)
{
fragmentTrans.addToBackStack(fragmentTag);
}
fragmentTrans.replace(contentId, fragment, fragmentTag);
fragmentTrans.commit();
}
Logcat Logcat
Process: retroroots.alphadraja, PID: 24440
java.lang.IllegalStateException: Activity has been destroyed
at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1345)
at android.app.BackStackRecord.commitInternal(BackStackRecord.java:597)
at android.app.BackStackRecord.commit(BackStackRecord.java:575)
at retroroots.alphadraja.CanisterEngine.Android.Fragment.FragmentConfig.ReplaceFragment(FragmentConfig.java:70)
at retroroots.alphadraja.Main.RestartGame(Main.java:71)
at retroroots.alphadraja.CanisterEngine.Android.Widgets.Dialog$2.onClick(Dialog.java:63)
at android.view.View.performClick(View.java:4473)
at android.view.View$PerformClick.run(View.java:18472)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5021)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
at dalvik.system.NativeStart.main(Native Method)
Kinda new to android development and fixing this might teach me a few things. 刚接触android开发的Kinda并解决此问题可能会教会我一些事情。
Also, please explain your answer. 另外,请解释您的答案。
Thanks 谢谢
Don't let super.onBackPressed()
called if you're showing a fragment
. 如果要显示
fragment
不要让super.onBackPressed()
调用。 Execute it only when user clicks on exit. 仅当用户单击退出时才执行。 That is probably causing your
Activity
to be destroyed. 这可能导致您的
Activity
被破坏。
Managed to solve it by declaring RestartGame
on a fragment instead of the main activity. 通过在片段而不是主要活动上声明
RestartGame
来解决该问题。 Thanks for the help 谢谢您的帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.