Android Kotlin Fragment访问ID为input_mtk的EditText返回空指针问题
问题成因
- 你当前使用了已废弃的Kotlin Android Extensions(合成视图绑定)功能,该功能支持直接通过XML控件ID调用实例,但在Fragment场景下直接写ID默认检索的是宿主Activity的布局树,而非Fragment自身加载的
R.layout.fragment_result布局,找不到对应ID的控件就会返回null。 - 若你未启用任何视图绑定能力,代码中直接使用
input_mtk本身没有做控件查找逻辑,自然无法获取实例。 - 额外排查点:确认你加载的
R.layout.fragment_result确实是包含input_mtk控件的布局,若加载了错误的布局文件也会出现该问题。
解决办法
方案1:使用官方推荐的View Binding(最优方案,长期适配)
View Binding是Google目前主推的视图绑定方案,类型安全无空风险,完全替代已废弃的合成绑定。
- 先在模块级build.gradle配置中开启View Binding:
若使用Gradle Groovy语法:
若使用Gradle Kotlin DSL语法:android { buildFeatures { viewBinding true } }android { buildFeatures { viewBinding = true } } - 修改你的Fragment代码如下:
class ResultFragment : Fragment() { // 布局fragment_result对应自动生成的绑定类为FragmentResultBinding private var _binding: FragmentResultBinding? = null private val binding get() = _binding!! override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = FragmentResultBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) getData() } private fun getData() { // XML中命名为input_mtk的控件会自动转为驼峰命名inputMtk val Mat = binding.inputMtk.text.toString() Log.e("test", Mat) } // 销毁视图时清空绑定实例,避免内存泄漏 override fun onDestroyView() { super.onDestroyView() _binding = null } }
方案2:使用findViewById快速临时修复
不需要修改构建配置的情况下,直接通过Fragment的视图实例查找控件即可:
class ResultFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_result, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 传入当前Fragment的视图实例用于查找控件 getData(view) } fun getData(view: View) { val inputMtk = view.findViewById<EditText>(R.id.input_mtk) val Mat = inputMtk.text.toString() Log.e("test", Mat) } }
内容的提问来源于stack exchange,提问作者fw_light
相关产品推荐
相关产品推荐

