java.lang.IllegalStateException:活动已被破坏
使用Robolectric,我对android非常陌生。我使用Activity创建了第一个测试课程。它很好地工作。 现在我想对片段进行测试。java.lang.IllegalStateException:活动已被破坏
@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());
}
}
这是我第一个Fragment类的测试类。它抛出
"java.lang.IllegalStateException: Activity has been destroyed" in startFragment#fragmentTransaction.commit().
任何人都知道如何解决这个问题?
您可以事先从https://github.com/msbaek/frame-test
由于发现整个源代码!
这些片段应该从活动中显示。该流程应该是:
- 在FragmentActivity类
- 分配一个新片段对象获取的片段管理者增加新分配的片段
在你的情况,你就不必一个一个连接真正的活动。您使用新的FragmentActivity()分配FragmentActivity并尝试获取支持管理器。虽然这个编译没有“真正的”活动能够管理你的片段。片段可以添加到已经显示的活动上,但事实并非如此。
我建议你阅读这个页面,因为它解释了这些事情非常好:http://developer.android.com/guide/components/fragments.html
谢谢!我成功地将活动连接到片段。 – 2013-03-22 13:53:40
Robolectric中的“真实”活动意味着什么? – 2013-05-28 14:41:18
@백명석你是如何将片段连接到活动的?我遇到了类似的问题。 – muneikh 2015-04-20 01:06:40
@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());
}
}
这是工作的版本。以下三行很重要(它来自robolectric源 - DialogFragmentTest)。
shadowOf(activity).callOnCreate(null);
shadowOf(activity).callOnStart();
shadowOf(activity).callOnResume();
就我而言,具体来说,我的问题是创建活动时。 我用
activity = Robolectric.buildActivity(MyActivity.class).get();
它应该是
activity = Robolectric.buildActivity(MyActivity.class).create().get();
希望它可以帮助别人:d
这事对我来说,当我用fragmentTransaction.commitAllowingStateLoss();来自其片段具有setRetainInstance(true)的子片段;我的活动属于导致旋转活动泄露的属性。
哼,不要在提交碎片事务之前破坏你的活动? – njzk2 2013-03-22 10:31:51