添加新的 Vector Asset 会改变现有 Android 资源的 ID?

Adding a new Vector Asset alters ids for existing Android resources?

无论我使用的是从 material.io 网站下载的 SVG,还是使用捆绑的“clipart”material 图标 SVG,这种情况一直在发生Android工作室。

例如,我转到“文件”>“新建”>“矢量资源”,选择“剪贴画”和 select 名为“曝光加 1”的图标。我接受默认值,它会在我的可绘制目录中为我创建此 xml 文件:src/main/res/drawable/ic_baseline_exposure_plus_1_24.xml:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
  <path
      android:fillColor="#FF000000"
      android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"/>
</vector>

只是添加这个 xml 文件的行为似乎对我的 R.txt 生成的文件做了一些可怕的事情,所以 id 值分配错误。在添加此文件之前,我的应用程序会启动并且图像会正确显示。添加此文件后,当我清理并重建并重新启动我的应用程序时,即使没有在代码中的任何地方进行任何更改,突然所有 ImageView 都显示错误的图像,例如一个填充有 R.drawable.somePng 现在显示 R.drawable.otherPng.

当我调试时,我可以看到代码仍在调用 R.drawable.somePng,但填充的 id 值实际上对应于 R.txt 文件中的 R.drawable.otherPng。

为什么会发生这种情况,我该如何解决?

在输入对 CommonsWare 评论的回复时,我想我已经找到问题所在了。

我的应用程序允许用户创建、保存和修改角色扮演游戏角色。有一个用户可以选择的常用字符列表,当创建这些字符时,我将它们保存在类似于此的数据对象中:

class CharacterData {
  final String name;
  ... etc
  @DrawableRes
  final int mainImage;
}

问题是当我添加新图像时 changes/reorders 分配的资源 ID 十六进制值。因此,当我再次加载我的应用程序时,我使用不再指向同一文件的已保存资源 ID 十六进制值加载这个已保存的角色对象。

如果我希望能够继续添加到应用程序而不破坏之前保存的任何字符,我似乎需要一种新方法来 save/reference 这些图像。