android兼容包 - 片段...没有附加到Activity

时间:2011-07-29 08:10:11

标签: android android-fragments android-loadermanager


您好, 我正面临这个问题: 我正在使用兼容包在Android应用程序中使用片段(min SDK 2.1)。

有时会在片段上发生随机异常,我无法弄清楚原因。 这是我收到的堆栈跟踪:

java.lang.IllegalStateException: Fragment FeedListFragment{438a54e8} not attached to Activity
    at android.support.v4.app.Fragment.getLoaderManager(Fragment.java:715)
    at com.myappli.ui.FeedListFragment.refreshUpdateDate(FeedListFragment.java:283)
    at com.myappli.ui.phone.FeedListActivity.onReceiveResult(FeedListActivity.java:277)
    at com.myappli.data.rssplayer.service.KTDetachableResultReceiver.onReceiveResult(KTDetachableResultReceiver.java:55)
    at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:43)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:4425)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    at dalvik.system.NativeStart.main(Native Method)

这是我在Fragment类中调用的相应代码:

public class FeedListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>, FeedListCursorAdapterListener {

...
    public void refreshUpdateDate() {
    getLoaderManager().restartLoader(LAST_UPDATE_CURSOR_ID, null, this);
    }
...
}

以下是调用片段的活动代码:

private FeedListFragment mCursorLoaderListFg;

if (!isFinishing()) {
    mCursorLoaderListFg.refreshUpdateDate();
    mCursorLoaderListFg.refreshDisplay();
    mCursorLoaderListFg.hideLoadingArticles();
}

以下是getLoaderManager()的片段源代码:

/**
* Return the LoaderManager for this fragment, creating it if needed.
*/
public LoaderManager getLoaderManager() {
    if (mLoaderManager != null) {
        return mLoaderManager;
    }
    if (mActivity == null) {
        throw new IllegalStateException("Fragment " + this + " not attached to Activity");
    }
    mCheckedForLoaderManager = true;
    mLoaderManager = mActivity.getLoaderManager(mIndex, mLoadersStarted, true);
    return mLoaderManager;
}

以下是崩溃前应用程序的步骤:

  1. 活动在后台调用方法。
  2. 在活动
  3. 上调用回调方法
  4. 在此回调方法中,活动调用片段
  5. 片段尝试启动一些需要活动的方法(如getLoadManager())。
  6. 该片段不再附加到activity =&gt;碰撞
  7. 我们尝试了两个修复:

    • 测试活动以检查活动是否完成(如上面的代码)
    • 使用方法isDetached测试片段。

    感谢您的帮助!!!

    如果我不清楚,请不要犹豫,向我提出更多信息。

4 个答案:

答案 0 :(得分:27)

我有类似的问题。

尝试使用isAdded()isVisible()代替isDetached()。不幸的是,isDetached()似乎没有像它应该的那样......

答案 1 :(得分:1)

对我来说有用的是使用片段的片段侦听器,为它添加一个getActivity函数,它返回Fragment侦听器的活动(创建片段的活动)。

现在,当我有一个需要活动的电话时,我只使用该功能。

答案 2 :(得分:0)

我通过将内部适配器类更改为静态内部类来解决此问题。

private static class MessagesAdapter extends CursorAdapter {
...

我不确定如何解释这个问题,但这与我们应该使用非静态内部类建议here

的事实有关。

答案 3 :(得分:0)

片段将附加到事件Fragment.onAttach(Activity)上的活动。 Fragment提供的Activity必须实现一个监听器。 为确保仅在事件之后调用方法refreshUpdateDate(),onAttach()应首先将该活动作为侦听器实现,然后调用侦听器fragmentAttached()方法。因此,当附加片段并且可以调用refreshUpdateDate()时,将通知您的活动,例如在fragmentAttached()中直接调用。 请参阅Creating event callbacks to the activity