2012-04-02 11 views
2

私は、起動時に1つのカスタムListFragmentをロードするFragmentActivityを持っていて、アイテムがクリックされた後にそのフラグメントを新しいフラグメントに置き換えます。 ListFragmentサブクラス内のリスト項目のハンドラでフラグメントaddToBackStackアプリケーションがクラッシュする

public void onCreate(Bundle savedInstanceState) { 
     ... 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.add(R.id.list_activity, listFragment, "venueListFragment"); 
     ft.commit(); 
     ... 
} 

:フラグメント活動のサブクラスで

public void onListItemClick(ListView l, View v, int position, long id) { 

    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 

    VenueListFragment newFragment = VenueListFragment.newInstance(nextListType, nextRowID); 

    ft.replace(R.id.list_activity, newFragment, "venueListFragment"); 
     ft.addToBackStack(null);     
    ft.commit(); 
} 

私はをクリックしようとすると、これが最初のフラグメントの後に正常に動作しますが、 2番目のフラグメントのアイテムで、私は内部FragmentManagerクラス内からこのエラーを受け取ります:

04-03 01:04:24.999: E/AndroidRuntime(15016): FATAL EXCEPTION: main 
04-03 01:04:24.999: E/AndroidRuntime(15016): java.lang.NullPointerException 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.LoaderManagerImpl.hasRunningLoaders(LoaderManager.java:824) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420) 
04-03 01:04:24.999: E/AndroidRuntime(15016): at android.os.Handler.handleCallback(Handler.java:587) 

私はaddToBackStackをコメントアウトすると気付きました。次のフラグメントはうまく読み込まれましたが、結果として私はもはや後方にナビゲートできなくなりました。また、次のリスト項目をクリックする前に5〜7秒待っても、アプリケーションがクラッシュすることはありませんが、リスト全体が既に表示されているため、フラグメント内のカーソルローダーはそれより早くロードを完了します。 onDestroyViewでは、私は明示的にCursorLoaderのcancelLoad()メソッドを呼び出します。

これを修正する方法についてのご意見はありますか?これはAndroid Compatibility Libraryのバグですか?

最新のACL(Rev 7)を使用し、最小SDKをAPIレベル7(2.1)に設定しています。

答えて

3

commit()の後にexecutePendingTransactions()を試してください。 commit()は非同期処理であるため、期待通りにすぐに実行できない可能性があります。

ft.commit(); 
getSupportFragmentManager().executePendingTransactions(); 
+0

あなたは命を救っています! – oohaba

関連する問題