前言:
Fragment 跳转返回重复加载重复执行 onCreateView 的问题通常是因为 Fragment 生命周期方法的调用顺序和使用不当所导致的。
1,onSaveInstanceState()方法
一种解决方法是在 Fragment 中使用 onSaveInstanceState() 方法保存 Fragment 的状态,并在 onCreate() 方法中进行状态恢复,避免重复执行 onCreateView()。具体步骤如下:
- 在 Fragment 中重写 onSaveInstanceState(Bundle outState) 方法,将状态信息保存到 Bundle 对象中。
- 在 Fragment 的 onCreate() 方法中检查 savedInstanceState 对象是否为 null,如果不是,则从 savedInstanceState 中恢复状态信息。
- 在 onCreateView() 方法中判断是否已存在 UI 视图,如果已经存在则不需要重新创建,直接返回缓存的视图即可。
示例代码如下:
public class MyFragment extends Fragment {
private View rootView;
private boolean isViewCreated = false;
private boolean isDataLoaded = false;
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("isDataLoaded", isDataLoaded);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
isDataLoaded = savedInstanceState.getBoolean("isDataLoaded");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (rootView == null) {
rootView = inflater.inflate(R.layout.fragment_my, container, false);
isViewCreated = true;
} else {
isViewCreated = false;
ViewGroup parent = (ViewGroup) rootView.getParent();
if (parent != null) {
parent.removeView(rootView);
}
}
if (!isDataLoaded) {
loadData();
}
return rootView;
}
private void loadData() {
// 加载数据的操作
isDataLoaded = true;
}
}
2,使用Fragment 的 replace() 方法进行跳转,而不是使用 add() 方法
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, new MyFragment());
transaction.addToBackStack(null);
transaction.commit();
3,使用标识:hasInitialized
在Fragment的onCreateView中进行数据的初始化和界面的更新等操作时,需要先判断之前是否已经进行过相关操作,如果已经操作过则不需要再次执行,可以通过增加标记变量来实现。
public class MyFragment extends Fragment {
private boolean hasInitialized = false;
private TextView mTextView;
private View mView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (!hasInitialized) {
mView = inflater.inflate(R.layout.fragment_my, container, false);
mTextView = (TextView) mView.findViewById(R.id.tv_content);
initData();
hasInitialized = true;
}
return mView;
}
private void initData() {
// 如果之前没有初始化过数据,则初始化并显示
// 如果已经初始化过了,则不需要再次初始化
if (TextUtils.isEmpty(mTextView.getText())) {
mTextView.setText("这是我的Fragment");
}
}
}
4,rootview是否已存在判断,此方法跟第三种第一种有一点儿相似之处。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (null != view) {
ViewGroup parent = (ViewGroup) view.getParent();
if (null != parent) {
parent.removeView(view);
}
} else {
view = inflater.inflate(R.layout.fragment_main, container, false);
initView(view);// 控件初始化
}
return view;
}
总结:
个人感觉最简单的解决方法是3,4 ,具体选用哪个方法需根据实际情况来定。文章来源:https://www.toymoban.com/news/detail-458975.html
注意:只适用于返回键重新回退的判断处理,切记,多次重复打开的界面貌似无效文章来源地址https://www.toymoban.com/news/detail-458975.html
到了这里,关于Android之Fragment 跳转返回重复加载重复执行onCreateView的四种解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!