重命名布局元素的 ID 不会重命名 viewBinding 引用
Posted
技术标签:
【中文标题】重命名布局元素的 ID 不会重命名 viewBinding 引用【英文标题】:Renaming ID of a layout element does not rename the viewBinding reference 【发布时间】:2020-08-21 16:07:47 【问题描述】:假设我有一个名为 activity_main.xml 的布局,它有一个元素:
<TextView
android:id="@+id/text_view"
android:layout_
android:layout_ />
一个名为 MainActivity.java 的活动。在其'onCreate 方法中,我使用viewBinding 对上述布局进行了膨胀,并设置了文本视图的文本:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.textView.setText("some text");
现在,如果我在 activity_main.xml 中重命名 TextView 的 ID,请按 Shift+F6
到@+id/text_view_new
之类的东西,那么onCreate
中的引用不会从binding.textView.setText("some text");
更改为binding.textViewNew.setText("some text");
这种行为是限制、错误还是我做错了什么?
【问题讨论】:
【参考方案1】:这种行为是限制、错误还是我做错了什么?
我的想法:
你做的一切都符合预期 我认为这不是错误或限制,而是它的工作原理。当然,有人可能会期待魔术并在活动中将您的“textView”更改为“textViewNew”,有人可能会说这是一个限制。了解 View Binding 的工作原理以及它是否可以发挥这种魔力非常重要。视图绑定机制生成额外的 Java 绑定类。所以在构建过程中发生了神奇的事情 - 生成了类 ActivityMainBinding,放置了公共字段“textView”。获得此类的实例后,您可以只编写“binding.textView”。
但是在 xml 中重命名“id”之后,自动更改这个自动生成的类并不是很聪明(如果您想用“textViewNew”替换“textView”,则必须执行该操作)。这就是为什么此更改不会影响代码中的任何内容
【讨论】:
只要我在XML中将“text_view”更改为“text_view_new”,它就可以生成“textViewNew”,然后我不明白为什么它不能重命名。无论如何,我只是想确认我是否遗漏了什么。 为什么改变这个自动生成的类不是很聪明? @JustAnEuropean,因为类的自动生成只是构建过程的辅助部分。在每次构建期间,都会重新创建自动生成的类。那里的任何更改 1) 不会影响您的应用程序,并且 2) 将在下次构建后被删除。以上是关于重命名布局元素的 ID 不会重命名 viewBinding 引用的主要内容,如果未能解决你的问题,请参考以下文章
R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)