Save interface (Listener) in onSaveInstanceState

£可爱£侵袭症+ 提交于 2019-12-03 13:25:30

问题


SaveInstanceState

For data like Integer, Long, String and else are fine, I just put it in the bundle and get it back once the onCreateView gets called again. But my fragment also has listener like following,

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

How can I have the listener to bundle so that I can get it back later?


回答1:


I recently just found the proper way to do this and I want to share for future reader of this topic.

The proper way to save listener of the fragment is not to save it, but instead, request from activity when fragment got attached to activity.

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();
    }
}
  • when the fragment attach to an activity, we check if activity implement TheFragmentContainer or not
  • if the activity does, request listener from activity.



回答2:


Any Classes without a suitable .put method in Bundle need to implement Serializable (as do any objects used within) or implement Parcelable (the latter is preferred). You can then use the putParcelable or putSerializable methods on Bundle.



来源:https://stackoverflow.com/questions/21043159/save-interface-listener-in-onsaveinstancestate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!