16

の動的リストを表示するためFragmentActivityに withを使用しようとしています。静的バージョンを実行する方法については、多くの例があります。私の問題は、表示するリストを動的にロードする必要があり、ユーザー入力 (追加/削除) に基づいて変更できることです。リストの作成に使用できる一連のデータをロードするためにカスタマイズを使用しようとしています。ViewPagerFragmentsandroid.support.v4.content.Loader

FragmentStatePagerAdapter#notifyDataSetChanged()アダプターを更新し、このコードが実行される時点で呼び出しを発行する時点に到達するまで、セットアップですべてがうまくいきます(からFragmentStatePagerAdapter)

public void finishUpdate(View container)
{
    if(mCurTransaction != null)
    {
        mCurTransaction.commit(); // BANG!!! The exception is thrown
        mCurTransaction = null;
        mFragmentManager.executePendingTransactions();
    }
}

トランザクションのコミットは次のメッセージで失敗します:

java.lang.IllegalStateException: Can not perform this action inside of onLoadFinished

FragmentManagerImplこのコード内で実行されるため:

private void checkStateLoss() {
    if (mStateSaved) {
        throw new IllegalStateException(
                "Can not perform this action after onSaveInstanceState");
    }
    if (mNoTransactionsBecause != null) {
        throw new IllegalStateException(
                "Can not perform this action inside of " + mNoTransactionsBecause);
    }
}

mNoTransactionsBecause値が null ではないことがわかり、結果が返されるときに設定されLoaderManagerImpl.LoaderInfoますonLoadFinished

何らかの形で変更しようとしているさまざまな変数を見ていましたtramsaction.commit()transaction.commitAllowingStateLoss()、トランザクションに関連するすべてのものはプライベートであるか、少なくともパッケージで保護されているようです。

必要なこと (およびその方法) を実行できるかどうか、誰かが一般的なアイデアを教えてくれますか?

ローダーを使用する代わりに、AsyncTask で読み込み操作を実行すると、コードが正常に動作することに注意してください。

4

3 に答える 3

35

これと非常によく似た問題があり、フラグメントのハンドラーを使用して解決しました。

次のような onLoadFinished() で警告ダイアログを表示したかった

public class MyFragment extends Fragment 
    implements LoaderManager.LoaderCallbacks<T> {

    public void onLoadFinished(Loader<T> loader, T data) {
        showDialog();
    }

    public void showDialog() {
        MyAlertDialogFragment fragment = new MyAlertDialogFragment();
        fragment.show(getActivity().getSupportFragmentManager(), "dialog");

    }
}

しかし、これはエラーを出しました

onLoadFinished 内でこのアクションを実行することはできません

解決策は、フラグメントにハンドラーを追加して、ダイアログの表示を処理することでした

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what == MSG_SHOW_DIALOG) {
            showDialog();
        }
    }
};

次に、 onLoadFinished(...) を変更して、代わりにハンドラーにメッセージを送信します

   public void onLoadFinished(Loader<T> loader, T data) {
        handler.sendEmptyMessage(MSG_SHOW_DIALOG);
    }
于 2012-04-11T15:43:24.993 に答える
0

rootView.post() を使用して動作します。クラススコープで rootView 変数を定義し、それを onCreateView() で膨らませるだけです。最後に onLoadFinished() は次のように使用します。

            rootView.post(new Runnable() {
                public void run() {
                    General.showFragment();
                }

            });
于 2015-09-07T17:46:35.410 に答える
0

好きなようにコピーFragmentStatePagerAdapterして変更することも、ゼロから独自に作成することもできますPagerAdapter。または、ローダーを使用しないでください。

于 2011-10-13T02:34:10.760 に答える