6

フラグメントに次の独自のインターフェイス実装があります。

@Override
    public void onReportChanged(Fragment sender, long id, int position) {
        // Views ein und ausblenden
        _List.setVisibility(View.GONE);
        _OnLoading.setVisibility(View.VISIBLE);
        _NoDataView.setVisibility(View.GONE);
        _ReportId = id;
        getLoaderManager().restartLoader(_LM_REPORTS, null, this);
    };

FragmentActivity は、別の Fragment (選択リスト) が 1 つの項目を選択したことをこの Fragment に報告します。その後、ListFragment は報告された ID (_ReportId) を持つ新しいデータをロードする必要があります。

しかし、私はNullPoinerExceptiononCreateLoader-Method に行く前にこのコードに取り掛かります。LogCat は次のとおりです。

05-28 14:24:37.905: E/AndroidRuntime(1775): FATAL EXCEPTION: main
05-28 14:24:37.905: E/AndroidRuntime(1775): java.lang.NullPointerException
05-28 14:24:37.905: E/AndroidRuntime(1775):     at android.support.v4.app.LoaderManagerImpl.restartLoader(LoaderManager.java:637)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at de.webducer.android.worktime.beta.ui.fragment.ReportListFragment.onReportChanged(ReportListFra gment.java:142)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at de.webducer.android.worktime.beta.ui.ReportListActivity.onReportSelected(ReportListActivity.java:97)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at de.webducer.android.worktime.beta.ui.fragment.ReportSelectorSpinnerFragment$1.onItemSelected(ReportSelectorSpinnerFragment.java:78)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at android.widget.AdapterView.fireOnSelected(AdapterView.java:882)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at android.widget.AdapterView.access$200(AdapterView.java:48)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:848)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at android.os.Handler.handleCallback(Handler.java:605)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at android.os.Looper.loop(Looper.java:137)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at java.lang.reflect.Method.invokeNative(Native Method)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at java.lang.reflect.Method.invoke(Method.java:511)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-28 14:24:37.905: E/AndroidRuntime(1775):     at dalvik.system.NativeStart.main(Native Method)

理由がわかりません。同じコード (ただし、他のリストの場合) は、他の FragmentActivity でも正常に機能します。

4

1 に答える 1

4

私は理由を見つけました:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle extra) {
    CursorLoader returnValue = null;
    if (_ReportId > 0) {
        switch (id) {
            case _LM_REPORTS:
                returnValue = new CursorLoader(getActivity(),
                    ReportContentProvider.CONTENT_URI_REPORT_DATA,
                    null,
                    ReportTable.COLUMN_ID + " =?",
                    new String[] { String.valueOf(_ReportId) },
                    null);
                    break;

                default:
                    break;
            }
        }
    return returnValue;
}

ローダーは常に実行する必要があります。条件if (_ReportId > 1)により例外が発生しました。条件がなければ、コードは正常に実行されます。

于 2012-06-20T11:40:18.193 に答える