Android之Fragment 跳转返回重复加载重复执行onCreateView的四种解决方法

54 篇文章 2 订阅

前言: 

Fragment 跳转返回重复加载重复执行 onCreateView 的问题通常是因为 Fragment 生命周期方法的调用顺序和使用不当所导致的。

1,onSaveInstanceState()方法

一种解决方法是在 Fragment 中使用 onSaveInstanceState() 方法保存 Fragment 的状态,并在 onCreate() 方法中进行状态恢复,避免重复执行 onCreateView()。具体步骤如下:

  1. 在 Fragment 中重写 onSaveInstanceState(Bundle outState) 方法,将状态信息保存到 Bundle 对象中。
  2. 在 Fragment 的 onCreate() 方法中检查 savedInstanceState 对象是否为 null,如果不是,则从 savedInstanceState 中恢复状态信息。
  3. 在 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 ,具体选用哪个方法需根据实际情况来定。

注意:只适用于返回键重新回退的判断处理,切记,多次重复打开的界面貌似无效

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Android Studio 中使用 Fragment 跳转需要使用 FragmentManager 和 FragmentTransaction。 首先,需要获取 FragmentManager,可以在 Activity 中使用 getSupportFragmentManager() 或 getFragmentManager() 方法获取。 然后,使用 FragmentManager 的 beginTransaction() 方法开启一个事务,使用 add()、replace() 或者 addToBackStack() 方法进行 Fragment 跳转。 最后,调用 commit() 方法提交事务。 示例代码如下: ``` FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, new FragmentA()); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); ``` 这样就可以实现 Fragment 跳转了。 ### 回答2: 在Android Studio中,Fragment之间的跳转可以通过FragmentManager和FragmentTransaction来实现。首先,在Java或Kotlin文件中,创建一个FragmentTransaction对象。然后,使用该对象调用addToBackStack()方法将当前Fragment放入返回堆栈。最后,调用commit()方法Fragment事务提交。这样可以确保在按下返回键时,回到上一个Fragment。 示例代码如下: ```java // 创建FragmentTransaction对象 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // 创建一个新的Fragment实例 MyFragment myFragment = new MyFragment(); // 将当前Fragment加入返回堆栈 transaction.addToBackStack(null); // 用新Fragment替换当前Fragment transaction.replace(R.id.fragment_container, myFragment); // 提交事务 transaction.commit(); ``` 这里,我们首先创建一个FragmentTransaction对象,然后创建一个新的Fragment实例。接着,我们将当前Fragment加入返回堆栈,用新的Fragment实例替换当前Fragment,最后提交事务。 在事务提交后,新的Fragment将显示在指定的容器中。如果在新的Fragment中需要传递参数,可以使用Bundle来传递参数。例如: ```java Bundle args = new Bundle(); args.putString("ARG_NAME", value); MyFragment myFragment = new MyFragment(); myFragment.setArguments(args); ``` 在新的Fragment中,可以使用getArguments()方法获取传递的参数: ```java Bundle args = getArguments(); String value = args.getString("ARG_NAME"); ``` 这样,我们就可以在Fragment之间实现传递数据和跳转了。 ### 回答3: 在 Android Studio 中,使用 Fragment 进行页面跳转可以提高应用的稳定性和性能,同时也可以提升用户体验。本文将介绍如何在 Android Studio 中使用 Fragment 进行页面跳转。 首先,需要在项目的布局文件中添加 Fragment 的容器。打开要添加 Fragment 的布局文件,比如“activity_main.xml”文件,找到需要添加 Fragment 的位置,在该位置添加以下代码: ``` <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 接下来,需要创建要跳转Fragment。新建一个 Fragment,比如命名为“FragmentA”。在 FragmentA 的布局文件中添加需要显示的控件和布局。 然后,在 Activity 中通过 FragmentManager 将 Fragment 添加到容器中进行跳转。在需要进行跳转的 Activity 的 Java 文件中,比如“MainActivity.java”文件,添加以下代码: ``` FragmentManager fm = getSupportFragmentManager(); FragmentA fragmentA = new FragmentA(); fm.beginTransaction().replace(R.id.fragment_container, fragmentA).commit(); ``` 其中,getSupportFragmentManager() 获取 FragmentManager 的实例;FragmentA 创建要跳转Fragment 的实例;beginTransaction() 开始一个 Fragment 事务;replace() 将旧的 Fragment 替换为新的 Fragment;commit() 提交事务。 这样,在运行应用时,就可以在 Activity 中展示 FragmentA 的布局。 若需要在 FragmentA 中跳转到另一个 FragmentB,需要先在 FragmentA 中添加跳转的控件,比如一个 Button,然后在 FragmentA 的 Java 文件中添加代码: ``` Button btn = view.findViewById(R.id.btn_fragment_b); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager fm = getFragmentManager(); FragmentB fragmentB = new FragmentB(); fm.beginTransaction().replace(R.id.fragment_container, fragmentB).addToBackStack(null).commit(); } }); ``` 其中,getFragmentManager() 获取 FragmentManager 的实例;FragmentB 创建要跳转Fragment 的实例;addBackStack() 将当前 Fragment 添加到回退栈中,从而实现返回操作;commit() 提交事务。 这样,在运行应用时,点击 FragmentA 中的 Button 就可以跳转FragmentB。 总体来说,使用 Fragment 进行页面跳转可以使应用变得更加灵活和智能,同时也能提高用户体验。以上就是在 Android Studio 中使用 Fragment 进行页面跳转方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值