如何解决Android Fragment中onActivityCreated方法被废弃的问题
解决方案
onActivityCreated从AndroidX Fragment 1.3.0版本开始正式废弃,官方弃用的核心原因是该方法过度耦合宿主Activity的生命周期,容易导致时序逻辑混乱、出现不可预期的崩溃。
推荐替换方案
- 绝大多数场景下,你原本写在
onActivityCreated中的逻辑(比如视图初始化、适配器绑定等和Fragment自身视图相关的操作),直接迁移到onViewCreated方法中即可。该方法在onCreateView执行完成、视图已经实例化完成后自动回调,完全可以覆盖原有使用场景。 - 如果你的逻辑确实强依赖宿主Activity完成
onCreate生命周期后才能执行,可以通过给宿主Activity的生命周期添加观察者实现。 - 如果你暂时不想迁移代码,也可以在
onActivityCreated方法上方添加@SuppressWarnings("deprecation")注解忽略警告,但该方法后续可能被彻底移除,还是建议尽快迁移到新的实现方式。
修改后的代码示例
package example.com.fragmentrecycler; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.OnLifecycleEvent; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * A simple {@link Fragment} subclass. */ public class ListFrag extends Fragment { RecyclerView recyclerView; RecyclerView.Adapter myAdapter; RecyclerView.LayoutManager layoutManager; View view; public ListFrag() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment view = inflater.inflate(R.layout.fragment_list, container, false); return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 原本写在onActivityCreated里的逻辑直接放这里,比如RecyclerView初始化 recyclerView = view.findViewById(R.id.recycler_view); layoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(layoutManager); // 此处替换为你自己的适配器初始化逻辑 // myAdapter = new XXXAdapter(); recyclerView.setAdapter(myAdapter); // 如果你确实需要等Activity创建完成再执行的逻辑,加下面这段即可,普通场景不需要 if (getActivity() != null) { getActivity().getLifecycle().addObserver(new LifecycleObserver() { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) void onActivityCreated() { // 要依赖Activity创建完成的逻辑放这里 getActivity().getLifecycle().removeObserver(this); } }); } } public void notifyDataChanged() { myAdapter.notifyDataSetChanged(); } }
修改完成后删除原有onActivityCreated重写方法,废弃提示就会自动消失。
内容的提问来源于stack exchange,提问作者Suthar
相关产品推荐
相关产品推荐

