java.lang.IllegalStateException未附加到Activity的片段

时间:2016-03-27 10:22:12

标签: java android android-fragments

在我收到Volley的回复后,我必须回到主要片段。 我有两个不同的截击请求,根据某些条件,我会称之为“a'在这个例子中。 奇怪的是当 a == 1时,popBackStack让我成功到主片段。 当a == 0时崩溃,我收到java.lang.IllegalStateException Fragment not attached to Activity 我尝试创建一个新的主要片段(transaction.commit ....),但它没有帮助。

if( a == 0 )
{
    VolleyManager.add(jsnObj,
        new RequestListener() {

                    @Override
                    public <T> void onSuccess(T object) {
                        mFragmentManager.popBackStack(DataManager.BACK_STACK_KEY_MAIN_FRAGMENT, 0);
                    }
                    });
                }
else if( a==1 )
{
    VolleyManager.update(jsnObj,
        new RequestListener() {

                @Override
                public <T> void onSuccess(T object) {
                        mFragmentManager.popBackStack(DataManager.BACK_STACK_KEY_MAIN_FRAGMENT, 0);
                }   
                });
    }

错误 -

  java.lang.IllegalStateException: Fragment MainFragment{6aaaf7f} not attached to Activity
  at android.app.Fragment.getResources(Fragment.java

问题似乎与getResources()有关,但是在== 1时我做同样的事情,而我根本没有遇到任何问题。

3 个答案:

答案 0 :(得分:3)

似乎在AsyncTask完成并调用onPostExecute时,MainFragment已与其activity分离。因此,activity已被销毁或fragment从未附加。

因此,如果片段附加到activity,则无法访问资源,因为这需要context而片段不具有activity确实

因此,在致电activity之前,您应该检查null是否getResources

像这样更新代码:

if(getActivity()!=null){
    String streetFormat = getActivity().getResources().getString( R.string.address_name_string );
    ....
}

答案 1 :(得分:2)

您必须在

上取消您的请求
  

onDestroyView()

片段的方法或检查片段是否已存活并添加到主机活动中 我应该这样做:

onDestroyView(){ Volley.cancelAllRequests() }

onResponse(){ if(getActivity() != null && isAdded(){ // here handle the response and update views, otherwise just cache the response!}}

答案 2 :(得分:0)

getResources()必须从具有Context的内容中调用,就像活动一样。片段本身没有Context,因为它没有实现它。如果您在片段中使用getResources(),则可以尝试以下操作:

String streetFormat = getActivity().getResources().getString( R.string.address_name_string );