在我收到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时我做同样的事情,而我根本没有遇到任何问题。
答案 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 );