通常,当设备配置更改(例如旋转设备)时,系统会重新创建 Fragment 和 Activity,从而删除它们的旧实例并创建新实例。如果 Fragment 持有对 Activity 中某些操作的引用,则需要在设备配置更改后重新创建 Fragment 实例时保留这些操作。
以下是保留 Fragment 中监听器的示例代码:
public class MyFragment extends Fragment { private OnItemClickListener mListener;
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnItemClickListener) {
mListener = (OnItemClickListener) context;
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
// 在 Fragment 中使用监听器
public void doSomething() {
if (mListener != null) {
mListener.onItemClick();
}
}
// 定义一个接口用于回调
public interface OnItemClickListener {
void onItemClick();
}
}
为了保留 Fragment 中的监听器,可以在 Fragment 中使用 setRetainInstance(true)。这样做后,系统将在设备配置更改后保留 Fragment 实例,而不是销毁并重新创建它。以下是示例代码:
public class MyFragment extends Fragment { private OnItemClickListener mListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
// 其他代码与前面相同,略去
}
请注意,当 Fragment 持有对 Activity 中的操作的引用时,仍然需要手动管理监听器。在 onAttach() 和 onDetach() 方法中分别为 mListener 分配和解除引用是一个好的实践。