【问题标题】:Renaming ID of a layout element does not rename the viewBinding reference重命名布局元素的 ID 不会重命名 viewBinding 引用
【发布时间】:2020-08-21 16:07:47
【问题描述】:

假设我有一个名为 activity_main.xml 的布局,它有一个元素:

<TextView
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

一个名为 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");

这种行为是限制、错误还是我做错了什么

【问题讨论】:

    标签: android rename android-viewbinding


    【解决方案1】:

    这种行为是限制、错误还是我做错了什么?

    我的想法:

    • 你做的一切都符合预期
    • 我认为这不是错误或限制,而是它的工作原理。当然,有人可能会期待魔术并在活动中将您的“textView”更改为“textViewNew”,有人可能会说这是一个限制。了解 View Binding 的工作原理以及它是否可以发挥这种魔力非常重要。

    视图绑定机制生成额外的 Java 绑定类。所以在构建过程中发生了神奇的事情 - 生成了类 ActivityMainBinding,放置了公共字段“textView”。获得此类的实例后,您可以只编写“binding.textView”。

    但是在 xml 中重命名“id”之后,自动更改这个自动生成的类并不是很聪明(如果您想用“textViewNew”替换“textView”,则必须执行该操作)。这就是为什么此更改不会影响代码中的任何内容

    【讨论】:

    • 只要我在XML中将“text_view”更改为“text_view_new”,它就可以生成“textViewNew”,然后我不明白为什么它不能重命名。无论如何,我只是想确认我是否遗漏了什么。
    • 为什么改变这个自动生成的类不是很聪明?
    • @JustAnEuropean,因为类的自动生成只是构建过程的辅助部分。在每次构建期间,都会重新创建自动生成的类。那里的任何更改 1) 不会影响您的应用程序,并且 2) 将在下次构建后被删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多