6

保存实例状态

对于 Integer、Long、String 等数据都可以,我只需将其放入包中,并在再次调用 onCreateView 时将其取回。但我的片段也有如下听众,

public class SomeFragment extends Fragment {
    public interface SomeListener {
        public void onStartDoingSomething(Object whatItIsDoing, Date when);
        public void onDoneDoingTheThing(Object whatItDid, boolean result);
    }

    private SomeFragmentListener listener;
    private String[] args;

    public static SomeFragment getInstance(SomeListener _listener, String... _args) {
        SomeFragment sf = new SomeFragment();
        sf.listener = _listener
        sf.args = _args

        return sf;
    }

    // rest of the class

    // the example of where do I invoke the listener are
    // - onSetVisibilityHint
    // - When AsyncTask is done
    // - successfully download JSON
    // etc.
} 

我怎样才能让听众捆绑,以便我以后可以取回它?

4

2 回答 2

7

我最近刚刚找到了执行此操作的正确方法,我想与该主题的未来读者分享。

保存片段侦听器的正确方法不是保存它,而是在片段附加到活动时从活动请求。

public class TheFragment extends Fragment {
    private TheFragmentListener listener;

    @Override
    public void onAttach(Context context) {
        if (context instanceof TheFragmentContainer) {
            listener = ((TheFragmentContainer) context).onRequestListener();
        }
    }

    public void theMethod() {
        // do some task
        if (listener != null) {
            listener.onSomethingHappen();
        }
    }

    public interface TheFragmentContainer {
        public TheFragmentListener onRequestListener();
    }

    public interface TheFragmentListener {
        public void onSomethingHappen();
    }
}
  • 当片段附加到一个活动时,我们检查活动是否实现了TheFragmentContainer
  • 如果活动有,请从活动中请求侦听器。
于 2015-08-07T03:25:50.827 回答
1

任何在 Bundle 中没有合适 .put 方法的类都需要实现 Serializable(就像其中使用的任何对象一样)或实现 Parcelable(首选后者)。然后,您可以在 Bundle 上使用 putParcelable 或 putSerializable 方法。

于 2014-01-10T11:44:32.787 回答