重新启动片段

时间:2014-11-29 23:59:23

标签: android android-fragments

我在我的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");
    }

}

1 个答案:

答案 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");
    }

}