2016-03-27 49 views
0

私がVolleyとの応答を受け取った後、メインフラグメントに戻る必要があります。 私はいくつかの条件に応じて、2つの異なるボレーリクエストを持っています。この例では、これを「a」と呼んでいます。 奇妙なことは、== 1、popBackStackが私に首尾よくを取得したときです。 a == 0とすると、がクラッシュし、java.lang.IllegalStateException Fragment not attached to Activity 私は新しいメインフラグメント(transaction.commit ....)を作成しようとしましたが、役に立たなかった。java.lang.IllegalStateExceptionアクティビティにフラグメントが添付されていません

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

あなたは、全体のエラーログを投稿することができます。 –

+0

'MainFragment'の内部でクラッシュしましたが、コードを更新することもできます。 –

+0

私はそれを更新しました。ありがとう – BVtp

答えて

0

getResources()は、アクティビティのようにContextのものから呼び出さなければなりません。フラグメント自体にはContextがありません。実装していないためです。あなたがフラグメントでgetResources()を使用している場合、あなたはこれを試すことができます:それは時間AsyncTask終了することにより、そのように思えるとonPostExecuteを呼び出し

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

それは動作しません..クラッシュはしませんが、MainFragmentに戻ってきません。私は空白のページが表示されます。 – BVtp

+1

これはあなたの他の論理がうまくいかないことを意味します。私たちは 'getResources()'によって引き起こされたクラッシュを修正しました – Vucko

3

MainFragmentは、そのactivityから切り離されました。そのため、activityは既に破壊されているか、fragmentは添付されませんでした。

フラグメントがactivityに添付ないである場合にはcontextを必要とし、フラグメントはありませんが、activityないのでだから、それはリソースにアクセスすることはできません。

getResourcesを呼び出す前にがnullであるかどうかを確認する必要があります。

更新このようなコード:フラグメントがすでにある場合は、

onDestroyView()フラグメントの

方法であなたの要求をキャンセルするか確認する必要があり

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

それは動作しません..クラッシュしませんが、MainFragmentに戻ってきません。私は空白のページが表示されます。 – BVtp

+0

次に、フラグメントをロードしていません。 'MainFragment'を追加する方法のコードを追加してください –

+0

私は投稿を更新しました。 – BVtp

2

生きていて、ホスト活動に追加されているかどうか 私はこのようなものに行きます:

onDestroyView(){ Volley.cancelAllRequests() } 

または

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

onDestroyViewに割り込みhttp呼び出しを提案することはできません。システムによって呼び出されたonStopコールバックが発生すると、すべてのリクエストを破棄する必要があります。 – nurisezgin

+0

@nurisezginそれで、保留中の要求がonStopで取り消され、ユーザがそれを押し戻すとどうなりますか?初期化されていないページが表示され、リクエストは処理されていません。 – MohammadReza

+0

これは、ボレーのリクエストをキャンセルするためのGoogleドキュメントです。 fyi https://developer.android.com/training/volley/simple.html#cancel – nurisezgin

関連する問題