java.lang.IllegalStateException:活动遭到破坏(java.lang.I

2019-07-22 14:49发布

与Robolectric工作,我很新到Android。 我使用活动由第一测试类。 它的工作很好。 现在,我想做出片段的测试。

@RunWith(RobolectricTestRunner.class)
public class LoginFragmentTest {
    private LoginFragment fragment;

    @Before
    public void setup() {
        fragment = new LoginFragment();
        startFragment(fragment);
        assertThat(fragment, notNullValue());
        assertThat(fragment.getActivity(), notNullValue());
    }

    private void startFragment(LoginFragment fragment) {
        FragmentManager fragmentManager = new FragmentActivity().getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(fragment, null);
        fragmentTransaction.commit();
    }

    @Test
    public void login() {
        EditText idEditText = (EditText)fragment.getActivity().findViewById(R.id.main_id);
        assertThat(idEditText, notNullValue());
    }
}

这是片段级我的第一个测试类。 它抛出

"java.lang.IllegalStateException: Activity has been destroyed" in startFragment#fragmentTransaction.commit().

任何人都知道如何解决这个问题?

你可以找到从整个源代码https://github.com/msbaek/frame-test

提前致谢 !!

Answer 1:

所述片段被假定从一个活动显示。 该流程应该是:

  • 在一个FragmentActivity类分配一个新对象的片段
  • 获得片段管理者增加新分配的片段

在你的情况,你没有一个真正的活动的连接。 您分配了新FragmentActivity(一FragmentActivity),并尝试以获得支持经理。 虽然这编译没有“真正”的活动能够管理你的片段。 片段可以在已经显示的活动被添加在这里它并非如此。

我建议阅读这个页面,因为它解释了这些事情非常好: http://developer.android.com/guide/components/fragments.html



Answer 2:

在我的情况下,特别是,在创建活动时,我的问题是。 我用

 activity = Robolectric.buildActivity(MyActivity.class).get();

它应该是

 activity = Robolectric.buildActivity(MyActivity.class).create().get();

希望它可以帮助别人:d



Answer 3:

@RunWith(RobolectricTestRunner.class)
public class LoginFragmentTest {
    private LoginFragment fragment;

    @Before
    public void setup() {
        fragment = new LoginFragment();
        startFragment();
        assertThat(fragment, notNullValue());
        assertThat(fragment.getActivity(), notNullValue());
    }

    private void startFragment() {
        FragmentActivity activity = new FragmentActivity();
        shadowOf(activity).callOnCreate(null);
        shadowOf(activity).callOnStart();
        shadowOf(activity).callOnResume();

        FragmentManager fragmentManager = activity.getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(fragment, null);
        fragmentTransaction.commit();
    }

    @Test
    public void login() {
        EditText idEditText = (EditText) fragment.getView().findViewById(R.id.main_id);
        assertThat(idEditText, notNullValue());
    }
}

这是工作的版本。 下面3条线是重要的(这是从robolectric源 - DialogFragmentTest)。

        shadowOf(activity).callOnCreate(null);
        shadowOf(activity).callOnStart();
        shadowOf(activity).callOnResume();


Answer 4:

这事对我来说,当我用fragmentTransaction.commitAllowingStateLoss(); 从子片段的父片段具有setRetainInstance(真); 我有活动财产是什么导致对旋转泄漏的活动。



文章来源: java.lang.IllegalStateException: Activity has been destroyed