使用View Binding从Fragment访问父Activity UI元素出现未解析引用报错
问题解决
错误原因
- 代码中声明的
binding是FragmentFirstBinding实例,仅绑定fragment_first.xml布局内的控件,无法直接访问宿主Activity布局中的控件。仅导入ActivityMainBinding不会自动关联Activity的布局实例,因此无法识别Activity中的TextView。 - 两处引用的控件名大小写不一致(
textView和textview),也会触发未解析引用报错,控件名必须和XML中定义的id完全匹配。
解决方案
场景1:需要操作宿主Activity中的TextView
需要先在宿主Activity中初始化ActivityMainBinding,再通过合法方式暴露给Fragment调用。
步骤1:修改宿主Activity代码
import com.mypc.myapp.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { // 若用耦合度更低的接口方式,此处可改为private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) } }
步骤2:Fragment中调用(两种可选方式)
直接获取Activity的Binding(简单直接,耦合度稍高)
修改Fragment的onViewCreated逻辑:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 获取宿主Activity的Binding实例,操作Activity内控件 val activityBinding = (requireActivity() as MainActivity).binding activityBinding.textView.visibility = View.INVISIBLE // Fragment自有控件操作,保证控件名和fragment_first.xml的id完全一致 binding.textview.setOnClickListener { Navigation.findNavController(view).navigate(R.id.goto_secondfragment) } }
接口回调(更规范,耦合度低)
首先定义公共接口:
interface ActivityViewController { fun hideMainTextView() }
宿主Activity实现接口:
class MainActivity : AppCompatActivity(), ActivityViewController { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) } override fun hideMainTextView() { binding.textView.visibility = View.INVISIBLE } }
Fragment中调用接口方法:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) (requireActivity() as? ActivityViewController)?.hideMainTextView() binding.textview.setOnClickListener { Navigation.findNavController(view).navigate(R.id.goto_secondfragment) } }
场景2:需要操作Fragment自有布局中的TextView
直接检查fragment_first.xml中对应控件的id,保证和代码中引用的名称完全一致(大小写严格匹配)即可。
内容的提问来源于stack exchange,提问作者user17489159
相关产品推荐
相关产品推荐

