2

起動時に1つのカスタムListFragmentをロードし、アイテムがクリックされた後にそれを新しいフラグメントに置き換えるFragmentActivityがあります。

フラグメントアクティビティサブクラス:

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

ListFragmentサブクラス内のリストアイテムハンドラー:

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互換性ライブラリのバグですか?

最新バージョンのACL(rev 7)を使用しており、min SDKをAPIレベル7(2.1)に設定しています。

4

1 に答える 1

3

あなたのcommit()試みをした後executePendingTransactions()commit()は非同期プロセスであるため、期待どおりにすぐに実行されない場合があります。

ft.commit();
getSupportFragmentManager().executePendingTransactions();
于 2012-04-02T19:21:56.147 に答える