欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > android Fragment使用

android Fragment使用

2025/7/8 16:41:31 来源:https://blog.csdn.net/qq_26296197/article/details/146902683  浏览:    关键词:android Fragment使用

Android Fragment 中,导入 idfindViewById)并给控件赋值的逻辑通常应该写在 onViewCreated() 方法中,而不是 onCreateView()


Fragment 生命周期 & 适合的位置

方法作用适合的操作
onCreateView()创建并返回 Fragment 的视图初始化 View 但不能直接操作 UI 元素
onViewCreated()onCreateView() 执行完后调用,View 已创建查找 id,设置监听器,赋值 UI 相关数据
onActivityCreated()(已废弃)ActivityonCreate() 结束后调用已废弃,改用 onViewCreated()

正确示例

class MyFragment : Fragment(R.layout.fragment_my) {  // 直接绑定布局(Kotlin推荐)override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 在 onViewCreated 中查找控件并赋值val textView = view.findViewById<TextView>(R.id.textView)textView.text = "Hello, Fragment!"val button = view.findViewById<Button>(R.id.button)button.setOnClickListener {textView.text = "Button Clicked"}}
}

注意:

  • onCreateView() 只负责返回 View,不要在这里写 findViewById(),否则可能会导致 NullPointerException
  • onViewCreated() 执行时,View 已创建,适合绑定 id 和监听事件。

不推荐的错误用法

class MyFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {val view = inflater.inflate(R.layout.fragment_my, container, false)// ❌ 这里直接操作 UI 可能导致问题(因为 View 可能未完全创建)val textView = view.findViewById<TextView>(R.id.textView)textView.text = "Hello, Fragment!"return view}
}

问题:

  • onCreateView() 只是创建 View,但 FragmentActivity 可能还没完成创建,某些情况下 UI 操作会失败。

总结

任务推荐写在
加载 Fragment 的布局onCreateView()
绑定 id 并赋值onViewCreated()
绑定 RecyclerView、ViewModelonViewCreated()
监听 LiveData、ViewModel 数据onViewCreated()
处理 Activity 相关逻辑onAttach()onViewCreated()

如果你的 Fragment 只是绑定 id 并设置 UI,最好的方式是在 onViewCreated() 里处理

二 onAttach和onCreateView使用示例

Fragment 中,onAttach()onCreateView() 是两个不同的生命周期方法,各自的用途和适用场景不同:


1. onAttach()

  • 触发时机:当 Fragment 被附加到 Activity 时调用(在 onCreateView() 之前)。
  • 适用场景
    • 获取 Activity 的引用
    • 传递 Context 依赖
    • 进行依赖注入
    • 适用于 FragmentActivity 之间的通信

示例:

class MyFragment : Fragment() {private var activityContext: Context? = nulloverride fun onAttach(context: Context) {super.onAttach(context)activityContext = context  // 获取 Activity 的 ContextLog.d("MyFragment", "Fragment 附加到 Activity")}override fun onDetach() {super.onDetach()activityContext = null  // 避免内存泄漏}
}

2. onCreateView()

  • 触发时机:当 Fragment 需要创建视图 时调用(返回 View)。
  • 适用场景
    • 加载 Fragment 的 UI
    • 初始化 View,但不做 UI 交互(如 findViewById()

示例:

class MyFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// 加载 Fragment 的布局return inflater.inflate(R.layout.fragment_my, container, false)}
}

3. onAttach()onCreateView() 的执行顺序

假设 Fragment 被添加到 Activity,生命周期的调用顺序是:

  1. onAttach()
  2. onCreate()
  3. onCreateView()
  4. onViewCreated()
  5. onStart()
  6. onResume()

示例日志:

D/MyFragment: Fragment 附加到 Activity (onAttach)
D/MyFragment: Fragment 创建 (onCreate)
D/MyFragment: 视图创建 (onCreateView)
D/MyFragment: 视图已创建 (onViewCreated)
D/MyFragment: Fragment 开始 (onStart)
D/MyFragment: Fragment 可见 (onResume)

4. 综合示例

完整 Fragment 代码,包含 onAttach()onCreateView()

class MyFragment : Fragment() {private var activityContext: Context? = nulloverride fun onAttach(context: Context) {super.onAttach(context)activityContext = contextLog.d("MyFragment", "onAttach: Fragment 已附加到 Activity")}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {Log.d("MyFragment", "onCreateView: Fragment 视图创建")return inflater.inflate(R.layout.fragment_my, container, false)}override fun onDetach() {super.onDetach()activityContext = nullLog.d("MyFragment", "onDetach: Fragment 从 Activity 分离")}
}

5. 何时使用 onAttach()onCreateView()

方法作用适用场景
onAttach()Fragment 绑定到 Activity获取 Activity 上下文,通信,依赖注入
onCreateView()创建并返回 View加载 UI 但不进行交互(如 findViewById()

如果只是 加载 UI,用 onCreateView();如果 Fragment 需要与 Activity 交互或获取 Context,用 onAttach()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词