2

ListFragment の外側から restartLoader() を呼び出すと、少し問題が発生します。シーケンスは、アクティビティを開く [追加] ボタンをタップ -> データを入力 -> [保存] をタップし、サーバーにデータを保存するための AsyncTask を開始します。データ転送が成功したら、前のアクティビティに戻ります -> getLoaderManager().restartLoader() を実行する ListFragment 内のメソッドをアクティビティに呼び出します。

これにより、必ず「java.lang.IllegalStateException: Fragment ListsFragment{42481238} not attached to Activity」エラーが発生します。restartLoader() を onResume に移動すると、動作が少し改善されますが、ListFragments に接続されたデータを直接変更する他のボタンがあり、何があっても IllegalStateException をトリガーします。

logcat からのエラー メッセージの抜粋

E/AndroidRuntime(29594): java.lang.IllegalStateException: Fragment ListsFragment{42450b18} not attached to Activity
E/AndroidRuntime(29594):        at android.support.v4.app.Fragment.getLoaderManager(Fragment.java:768)
E/AndroidRuntime(29594):        at testpager.ListsFragment.resetList(ListsFragment.java:122)

私は何が欠けていますか?この例外をトリガーせずに FragmentActivity から ListFragment を更新するにはどうすればよいですか?

4

2 に答える 2

3

ListFragmentから更新しないでください... これはFragmentActivity、両方の の基本的な設計ガイドラインに反しますFragment。または)。代わりにインターフェースを実装する必要があります。LoaderManagerActivityFragmentListFragmentLoaderManager.LoaderCallbacks<D>

別の注意として、Loaders は、基になるデータ ソースが変更されたときに通知を受け取り、新しい非同期ロードを実行して結果をコールバックのonLoadFinishedメソッドに返すように通知することになっています。restartLoader最新のデータを取得するために に依存する必要がある場合は、何か間違ったことをしています (つまり、 にデータを再クエリContentObserverするよう通知する変更が通知されていませんLoader)。

于 2012-07-25T02:25:57.820 に答える
0

私の理解が正しければ、アクティビティ B を介してデータを保存するメニュー オプションを持つローダーを作成したアクティビティ A があります。アクティビティ B がデータを保存したら、アクティビティ A のローダーを再起動する必要があります。よろしいですか?

もしそうなら、アクティビティ B でこれをやってみてください:

public interface onSavedDataListener { 
     void DoneSavingData(); //add parameters if needed
}
... //Whatever other code you have
 //This method should be called from your AsyncTask onFinished() method
 public void dataSaved() { //add parameters if needed
    onSavedDataListener activity = (onSavedDataListener) getActivity();
    activity.DoneSavingData(); //make sure you add the same parameters as you did above
}

次にアクティビティ A で、リスナーを実装します。

public class ActivityA extends ListFragment implements onSavedDataListener {

    ... //your other code here

    //Add the listener function
    public void DoneSavingData() { //make sure any parameters you have get added here
        getLoaderManager().restartLoader(id, args, loadercallback);
    }

    ...

本質的には、アクティビティ A に実装されているアクティビティ B にリスナー オブジェクトを作成します。

于 2012-07-25T02:03:11.343 に答える