Android 在onSaveInstanceState中保存接口(侦听器)
SaveInstanceState 对于Integer、Long、String等数据,我只是将其放入包中,并在再次调用onCreateView后将其取回。但我的片段也有如下内容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);
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
- 如果活动执行此操作,请从活动请求侦听器
onAttach(活动)
现在已不推荐使用。新的方法签名是onAttach(上下文)
。现在你知道如何解决这个问题了吗?你可以通过片段中的getActivity()方法来获取活动,并执行与上面相同的操作。我知道为时已晚,但这是为了未来的读者我在这里很多年后,但我找到了另一个解决方案。如果savedInstanceState!=无效的