java.lang.IllegalStateException:活动已被破坏

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

由于发现整个源代码!

+0

哼,不要在提交碎片事务之前破坏你的活动? – njzk2 2013-03-22 10:31:51

这些片段应该从活动中显示。该流程应该是:

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

在你的情况,你就不必一个一个连接真正的活动。您使用新的FragmentActivity()分配FragmentActivity并尝试获取支持管理器。虽然这个编译没有“真正的”活动能够管理你的片段。片段可以添加到已经显示的活动上,但事实并非如此。

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

+0

谢谢!我成功地将活动连接到片段。 – 2013-03-22 13:53:40

+0

Robolectric中的“真实”活动意味着什么? – 2013-05-28 14:41:18

+0

@백명석你是如何将片段连接到活动的?我遇到了类似的问题。 – 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)的子片段;我的活动属于导致旋转活动泄露的属性。