重命名布局元素的 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 引用的主要内容,如果未能解决你的问题,请参考以下文章

重命名 PHP 数组键并维护元素数据

无法删除索引或重命名表 PHPmyadmin

R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)

无法重命名资源(布局)文件(已安装 Android Studio 3.0 Beta 3)

重命名元素的 XSLT 问题——更改命名空间

如何在mongodb中重命名整个集合中的一个元素名称