当前位置: 首页 > news >正文

android.app.Fragment和androidx.fragment:fragment的区别

android.app.Fragment 与 androidx.fragment.app.Fragment 的区别

这两个 Fragment 实现代表了 Android 碎片化开发的两个时代,以下是它们的核心区别:

一、起源与演变

android.app.Fragmentandroidx.fragment.app.Fragment
引入时间Android 3.0 (API 11, 2011年)2018年作为AndroidX的一部分推出
所属库Android框架内置Jetpack组件库
发展状态已废弃(Deprecated)持续维护更新

二、核心区别

1. 兼容性支持

java

复制

下载

// 旧版 - 最低API 11
import android.app.Fragment;// 新版 - 支持API 14+ (通过兼容库实现)
import androidx.fragment.app.Fragment;

2. 生命周期管理

特性android.app.Fragmentandroidx.fragment.app.Fragment
生命周期感知强(与Lifecycle组件深度集成)
onAttach()变化onAttach(Activity)onAttach(Context) + onAttachFragment()
View生命周期分离无明确分离新增onViewCreated()getViewLifecycleOwner()

3. 事务处理差异

java

复制

下载

// 旧版API
getFragmentManager().beginTransaction().add(R.id.container, oldFragment).commit();// 新版API
getSupportFragmentManager().beginTransaction().setReorderingAllowed(true)  // 新增优化选项.add(R.id.container, newFragment).commitNow();  // 新增立即执行选项

4. 与架构组件集成

集成能力android.app.Fragmentandroidx.fragment.app.Fragment
ViewModel需要额外适配原生支持
LiveData需要额外处理完美兼容
Data Binding兼容性差完整支持

三、迁移必要性

必须迁移的情况:

  1. 使用 Jetpack 组件(ViewModel/LiveData/Navigation)

  2. 需要 Material Design 组件(如 BottomSheetDialogFragment)

  3. 项目已升级到 AndroidX

  4. 需要 Fragment 结果 API(setFragmentResult

迁移示例:

java

复制

下载

// 迁移前 - 旧版
public class OldFragment extends android.app.Fragment {public void onAttach(Activity activity) {...}
}// 迁移后 - 新版
public class NewFragment extends androidx.fragment.app.Fragment {public void onAttach(Context context) {super.onAttach(context);// 更安全的Context访问}
}

四、现代Fragment最佳实践

1. 基础使用模板

java

复制

下载

public class ModernFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_modern, container, false);}@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);// 安全的视图操作位置TextView tv = view.findViewById(R.id.text_view);// 配合ViewModel使用MyViewModel vm = new ViewModelProvider(this).get(MyViewModel.class);vm.getData().observe(getViewLifecycleOwner(), data -> {tv.setText(data.toString());});}
}

2. 关键API改进

  • 安全传递参数

    java

    复制

    下载

    // 创建Fragment的推荐方式
    public static ModernFragment newInstance(String param) {ModernFragment fragment = new ModernFragment();Bundle args = new Bundle();args.putString("key", param);fragment.setArguments(args);return fragment;
    }
  • 结果回调API

    java

    复制

    下载

    // 发起方
    setFragmentResult("requestKey", new Bundle());// 接收方
    getParentFragmentManager().setFragmentResultListener("requestKey", this, (key, bundle) -> {// 处理结果
    });

五、常见问题解决

问题1:混合使用两种Fragment导致的崩溃

复制

下载

java.lang.IllegalStateException: Fragment is not a support Fragment

解决方案

  • 统一使用androidx.fragment.app包下的类

  • 检查所有相关导入语句

问题2:getActivity()返回null

java

复制

下载

// 安全访问方式(AndroidX Fragment)
if (isAdded()) {Context context = requireContext();Activity activity = requireActivity();
}

问题3:View生命周期问题

java

复制

下载

// 正确观察LiveData(避免内存泄漏)
viewModel.getLiveData().observe(getViewLifecycleOwner(), data -> {// 更新UI
});

六、版本兼容建议

  1. 新项目:100%使用AndroidX Fragment

  2. 旧项目迁移步骤

    • 全局替换android.app.androidx.fragment.app.

    • 替换getFragmentManager()getSupportFragmentManager()

    • 更新所有Fragment基类

    • 测试所有Fragment事务和回调

  3. 依赖配置

    gradle

    复制

    下载

    dependencies {def fragment_version = "1.5.5"implementation "androidx.fragment:fragment:$fragment_version"// 可选-用于测试debugImplementation "androidx.fragment:fragment-testing:$fragment_version"
    }

AndroidX Fragment 是现代Android开发的基石,相比旧版提供了更稳定的生命周期管理、更好的架构组件集成以及更安全的API设计。

http://www.xdnf.cn/news/340993.html

相关文章:

  • ActiveMQ 源码剖析:消息存储与通信协议实现(四)
  • 预训练模型实战手册:用BERT/GPT-2微调实现10倍效率提升,Hugging Face生态下的迁移学习全链路实践
  • 数据中台-数仓分层结构【Doris】
  • 【LunarVim】CMake LSP配置
  • 基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)
  • python 上海新闻爬虫
  • Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
  • 【前端基础】8、CSS的选择器
  • HTML10:iframe内联框架
  • AI时代企业应用系统架构的新思路与CIO变革指南
  • 如何使用极狐GitLab 软件包仓库功能托管 helm chart?
  • 【RAG技术全景解读】从原理到工业级应用实践
  • Redis 8.0正式发布,再次开源为哪般?
  • 基于STM32、HAL库的CP2102-GMR USB转UART收发器 驱动程序设计
  • keep the pipe Just full But no fuller - BBR 与尘封 40 年的求索
  • ETL介绍及kettle等工具学习
  • 科学发现 | 源于生活的启示与突破计划的创新
  • android-ndk开发(9): undefined reference to `__aarch64_ldadd4_acq_rel` 报错分析
  • [数据库之十一] 数据库索引之联合索引
  • 大模型调优方法与注意事项
  • 【Java 专题补充】流程控制语句
  • RPC、gRPC和HTTP的区别
  • Java大师成长计划之第15天:Java线程基础
  • uniapp|实现多终端视频弹幕组件、内容轮询、信息表情发送(自定义全屏半屏切换、弹幕启用)
  • BGP基础
  • 抛物线法(二次插值法)
  • 《AI大模型应知应会100篇》第52篇:OpenAI API 使用指南与最佳实践
  • 65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 创建 3D 图形
  • flutter 的热更新方案shorebird
  • Vue3项目目录重命名指南