Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在onSaveInstanceState中保存接口(侦听器)_Android_Activity Lifecycle_Fragment Lifecycle - Fatal编程技术网

Android 在onSaveInstanceState中保存接口(侦听器)

Android 在onSaveInstanceState中保存接口(侦听器),android,activity-lifecycle,fragment-lifecycle,Android,Activity Lifecycle,Fragment Lifecycle,SaveInstanceState 对于Integer、Long、String等数据,我只是将其放入包中,并在再次调用onCreateView后将其取回。但我的片段也有如下内容 public class SomeFragment extends Fragment { public interface SomeListener { public void onStartDoingSomething(Object whatItIsDoing, Date when);

SaveInstanceState

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

如何将侦听器捆绑,以便稍后将其取回?

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

我最近刚刚找到了正确的方法,我想与本主题的未来读者分享

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

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();
    }
}
  • 当片段附加到活动时,我们检查活动是否实现了FragmentContainer
  • 如果活动执行此操作,请从活动请求侦听器

为什么要这样做,持有侦听器对象的原因是什么?活动在多个地方使用了此片段。每个活动对这个回调的反应都不同,所以我认为这是一个合适的设计模式,你有其他模式推荐吗?好的,如果它是一个监听器,我猜它是一个接口,对于你想要监听器的每个活动,你可以在那个类中实现监听器,并为每个活动分别定义功能。但是,这又回到了我最初的问题,我如何保存状态或侦听器与委托之间的引用?您不需要保留侦听器,它将在重新创建活动时注册,实现侦听器使其成为活动/类的一部分。这是一个很好的回答,确实帮助我特别考虑了我的情况。我一直试图在父活动的onCreate上设置片段的侦听器,但旋转使其出现问题。读了这个答案后,我开始思考我的方法,并通过小范围的改写,找到了一个更好的解决方案。谢谢
onAttach(活动)
现在已不推荐使用。新的方法签名是
onAttach(上下文)
。现在你知道如何解决这个问题了吗?你可以通过片段中的getActivity()方法来获取活动,并执行与上面相同的操作。我知道为时已晚,但这是为了未来的读者我在这里很多年后,但我找到了另一个解决方案。如果savedInstanceState!=无效的