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

Как я могу связать слушателя, чтобы я мог вернуть его позже?

6
Tar_Tw45 10 Янв 2014 в 15:27

2 ответа

Лучший ответ

Недавно я только что нашел правильный способ сделать это, и я хочу поделиться с вами будущим читателем этой темы.

Правильный способ сохранить слушателя фрагмента - не сохранять его, а вместо этого запрашивать у активности, когда фрагмент прикреплен к активности.

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 или нет
  • если активность есть, запросите слушателя у активности.
7
Tar_Tw45 5 Сен 2018 в 08:08

Любые классы без подходящего метода .put в Bundle должны реализовать Serializable (как и любые объекты, используемые внутри) или реализовать Parcelable (последнее предпочтительнее). Затем вы можете использовать методы putParcelable или putSerializable в Bundle.

1
NigelK 10 Янв 2014 в 11:44