2016-07-20 18 views
0

VolleyのonResponse()のフラグメントを置き換えようとしています。それは変わってきていますが、奇妙な方法です。VolleyのOnResponse()内のフラグメントが置き換えられない

  • 古いものはまだ表示されていませんが、新しいものは表示されません。
  • 古いフラッグは非対話型です&クリックイベントは によって処理されています。

新しいフラッグが古いフラッグの下にあるようです。

VolleyのonResponse()の外側でフラグを置き換えようとすると、すべての動作が正常に行われます。古いフラグが消えて新しいフラグが表示されます。

getNetworkManager().jsonGETRequest(new NetworkManagerRequestData(getActivity(), this, 
      orderListUrl, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject jsonObject) { 

        FragmentManager fragmentManager = getSupportFragmentManager(); 
        FragmentTransaction transaction = fragmentManager.beginTransaction(); 
        transaction.replace(R.id.main_frame, IdleFragment.newInstance()); 
        transaction.commit(); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError volleyError) { 
       .. 
     } 
    }, NetworkManager.getDefaultPolicyForNonTransactions(), false)); 

フラグメントは、FrameLayoutを使用して動的に追加されています。私には5〜6枚の葉が付いています。このトランザクションを除き、すべてがアニメーションで美しく動作しています。

ここに、空のFrameLayoutであるR.id.main_frameがあります。

<FrameLayout 
    android:id="@+id/main_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    .. 
    /> 

UPDATE だから私は、これは同じ動作を持ってAsyncTask

内のフラグメントのトランザクションを実装
new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      FragmentTransaction transaction = fragmentManager.beginTransaction(); 
      transaction.replace(R.id.main_frame, IdleFragment.newInstance()); 
      transaction.commit(); 
     } 
    }.execute(); 

を試してみました。通常、非同期コールバックの外部でのトランザクションはうまくいきます。ここで

は、私はあなたが静的なXMLレイアウトファイルに配置された断片を置換することはできません

<android.support.v4.widget.SwipeRefreshLayout 
    android:id="@+id/swipe_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/pitch_grey" 
     android:clickable="true" 
     android:fillViewport="true"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
       ..... 
     </RelativeLayout> 
    </ScrollView> 
</android.support.v4.widget.SwipeRefreshLayout> 
+0

非同期呼び出しでフラグメントトランザクションを開始することは推奨されません。 IllegalStateExceptionが発生する可能性があります。 – Embydextrous

+0

私は必要な点検をしています。 –

答えて

2

問題は、スワイプリフレッシュレイアウトです。リフレッシュ中にフラグメントを置換しようとすると、前のフラグメントがフリーズします。これはSwipeRefreshLayout自体の問題です。

FrameLayout内にswipeRefreshLayoutをラップすることができます。これは機能するかもしれません。

<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<android.support.v4.widget.SwipeRefreshLayout 
android:id="@+id/swipe_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/pitch_grey" 
    android:clickable="true" 
    android:fillViewport="true"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
      ..... 
    </RelativeLayout> 
</ScrollView> 
</android.support.v4.widget.SwipeRefreshLayout> 
</FrameLayout> 

参考:When switch fragment with SwipeRefreshLayout during refreshing, fragment freezes but actually still work

0

を交換しようとしていますFRAGのレイアウトです。アイドル状態のフラグメントは静的に配置されていますか?レイアウトにコンテナ(FrameLayoutなど)を作成してから、フラグメントをFragmentTransactionを使用してプログラムで追加する必要があります。

また、フラグメントコンテナとして空のFrameLayoutを使用します。 LinearLayoutまたはRelativeLayoutを使用しないでください。私はLinearLayoutを使ってこの問題に直面し、LinearLayoutをFrameLayoutに置き換えました。

もう1つの提案は、非同期呼び出しでフラグメントトランザクションを実行しないようにすることです。 IllegalState Exceptionが発生することがあります。それでもやりたい場合は、commitの代わりにcommitAllowStateLossを使用してください。

+0

質問を編集しました。 –

+0

元々commitAllowingStateLoss()を使用していました。いくつかの問題を引き起こしていると思われるので、私はcommit()に戻りました。しかし、ダイスはまだありません。 –

+0

フラグメントクラスは、android.app.FragmentまたはSupport Fragmentを拡張しますか?すべてのフラグメントは、Fragmentクラスをサポートする必要があります。 – Embydextrous

関連する問題