我在我的Activity中重新启动片段时出现问题。当用户完成一轮时,我需要活动实现的片段才能完全重启。该片段有一个if / else语句,用于检查是否已经播放了一个回合,如果是,则需要使用其他值重新加载该片段。我一直在寻找并且似乎找不到任何关于此的东西,所以非常感谢任何帮助!
public class BoardActivity extends Activity implements BoardFragment.OnFragmentInteractionListener {
public void gameTimer() {
Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView tv = (TextView) findViewById(R.id.RoundTimer);
tv.setText(String.valueOf(minutes) + ":" + String.valueOf(seconds) + ":" + String.valueOf(milliseconds));
milliseconds -= 1;
if (milliseconds == 0) {
tv.setText(String.valueOf(minutes) + ":" + String.valueOf(seconds) + ":" + String.valueOf(milliseconds));
milliseconds = 1000;
seconds = seconds - 1;
}
if (seconds == 0) {
timerout = "Out of Time!";
tv.setText(String.valueOf(timerout));
}
if (timerout == "Out of Time!") {
Model.gameCounter = Model.gameCounter + 1;
nextRound();
}
}
});
}
}, 0, 1);
}
private void nextRound(){
//redirect to next round
if (Model.gameCounter <= 1 && Model.gameCounter < 4) {
Log.d(TAG,"new round");
Fragment frg = null;
frg = getFragmentManager().findFragmentByTag("BoardFragment");
final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
} else {
//eventually add score screen
Log.d(TAG,"same round");
}
}
答案 0 :(得分:0)
关于附加和分离的文档确实说视图层次结构被破坏并重建。但是,视图的状态是保持不变的,因此应该看起来好像什么也没发生(听起来就像你看到的那样)。文档说,当片段进入后台时,会发生同样的事情。
因此,我认为你有两个“重启”片段的选项。
选项1:每次创建一个新片段。
private void nextRound(){
//redirect to next round
if (Model.gameCounter <= 1 && Model.gameCounter < 4) {
Log.d(TAG,"new round");
Fragment frg = null;
frg = getFragmentManager().findFragmentByTag("BoardFragment");
Fragment newfrg = new BoardFragment();
final FragmentTransaction ft = getFragmentManager().beginTransaction();
if (frg == null) {
ft.add(R.id.board_container, newfrg, "BoardFragment");
} else {
ft.replace(R.id.board_container, newfrg, "BoardFragment");
}
ft.commit();
} else {
//eventually add score screen
Log.d(TAG,"same round");
}
}
选项2:在BoardFragment中编写一个方法来重置下一轮的电路板,并在重新启动时调用它。
private void nextRound(){
//redirect to next round
if (Model.gameCounter <= 1 && Model.gameCounter < 4) {
Log.d(TAG,"new round");
BoardFragment frg = (BoardFragment)
getFragmentManager().findFragmentByTag("BoardFragment");
frg.restart();
} else {
//eventually add score screen
Log.d(TAG,"same round");
}
}