【问题标题】:Save interface (Listener) in onSaveInstanceStateonSaveInstanceState 中的保存接口(Listener)
【发布时间】:2014-01-10 11:27:28
【问题描述】:

保存实例状态

对于 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.
} 

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

【问题讨论】:

  • 为什么要这样做,持有监听器对象的原因是什么??
  • 这个片段被活动在多个地方使用。每个活动对这个回调的反应不同,所以我认为这是一个合适的设计模式,你有其他推荐的模式吗?
  • 好吧,如果它是一个监听器,我猜它是一个接口,并且对于您想要监听器的每个活动,您可以在该类中实现监听器并为每个活动单独定义功能。
  • 但是,这又回到了我原来的问题,如何保存状态或监听器和委托之间的引用?
  • 你不需要保留监听器,它会在活动重新创建时注册,实现监听器使其成为活动/类的一部分

标签: android activity-lifecycle fragment-lifecycle


【解决方案1】:

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

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

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
  • 如果活动有,请从活动中请求监听器。

【讨论】:

  • 这是一个很好的答案,确实帮助我特别考虑了我的情况。我一直试图在父 Activity 的 onCreate 上设置片段的监听器,但旋转使其出现问题。阅读这个答案让我思考我的方法,并且通过 lil 重写,产生了一个更好的解决方案。谢谢!
  • onAttach(Activity activity) 现在已弃用。新方法签名是onAttach(Context context)。任何想法现在如何解决这个问题?
  • 你可以在fragment中通过getActivity()方法获取activity,做和上面一样的事情。我知道为时已晚,但这是为未来的读者准备的
  • 多年后我在这里,但我找到了另一个解决方案。如果 savedInstanceState != null,您可以从片段的父活动重新创建片段。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多