如何多次运行同一个片段?

时间:2016-11-22 21:28:27

标签: java android android-fragments

我正在创建一个允许用户进行少量测试的应用。因此,TestActivity(带有“开始测试”按钮),PreTestFragmentTestFragment(包含测试结果)构成PostTestFragment。由于TestFragment将是托管单个问题的片段,我希望它多次显示(比方说10)。

所有我想出的就是制作一个static计数器,每当用户按下TestFragment中的NEXT时该计数器就会递增,这使得他在计数器达到10后退出。

我是片段管理的新手,所以我觉得在执行NEXT按钮的onClick()时可能会遇到一些错误。

static private int current_question;


public void onClick(View view) {
    FragmentManager mng = getFragmentManager();
    FragmentTransaction fgmTr = mng.beginTransaction();
    Fragment currentFgm = mng.findFragmentByTag(FragmentTags.TEST_FTAG.toString());
    Fragment nextFgm;
    Bundle bundle = currentFgm.getArguments();
    if (current_question < 10) { // test still running
        current_question++;
        nextFgm = mng.findFragmentByTag(FragmentTags.TEST_FTAG.toString());
        // ...
        // putting needed data in the bundle
        // ...
        if (nextFgm == null)
            nextFgm = new TestFragment();
    } else { // test is finished
        nextFgm = mng.findFragmentByTag(FragmentTags.POST_FTAG.toString());
        // ...
        // putting different needed data in the bundle
        // ...
        if (nextFgm == null)
            nextFgm = new PostTestFragment();
    }
    nextFgm.setArguments(bundle);
    fgmTr.replace(R.id.test_body, nextFgm, FragmentTags.POST_FTAG.toString());     
    fgmTr.addToBackStack(null);
    fgmTr.commit();
}


@Override
public void setArguments(Bundle args) {
    super.setArguments(args);
    // Should I use if-else here too to pass different data in the bundle?
}

第一次出现以下错误时运行并按“NEXT”:

  

java.lang.IllegalStateException:片段已激活

如何修复此代码?

2 个答案:

答案 0 :(得分:0)

如果您的片段(nextFgm)已经创建,则无法调用setArguments。 看一看: https://developer.android.com/reference/android/app/Fragment.html#setArguments%28android.os.Bundle%29

答案 1 :(得分:0)

通常我是通过每次创建一个新片段的实例来实现的:

android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.frame, new myFragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();