有没有办法在原生 android (Java) 中动态加载 Material 图标?

Is there a way to dynamically load Material Icons in native android (Java)?

最近我能够动态加载 Material Design Icons in Flutter by using the flutter_icons/flutter_icons.dart

// First Approach
Icon icon = new Icon(Icons.settings);

// Second Approach
icon = new Icon(MaterialIcons.getIconData(Model.dynamic_icon_name);

Flutter Screenshot

这让我开始思考是否可以使用原生 android 方法来做类似的事情,例如

// Glide Theoretical Example
Glide.with(context.getApplicationContext())
  .asBitmap()
  .load(MaterialIcons.getIconData(Model.dynamic_icon_name))
  .apply(new RequestOptions().fitCenter())
  .into(iconView);

我认为知道这一点会很有趣,因为我认为可以提供一些优势,开发人员不需要将这些资产与应用程序捆绑在一起

在 Android 上没有有效的本地处理方法,所以我最终采用的解决方案是让服务器托管这些图标,我可以像这样使用 Glide 来提供它们。

第 1 步:后端设置

  • 下载您选择的图标的 png 资源,即:来自 Material Icons link
  • thumbs_up 图标
  • 现在您可以继续将图像资产解压缩到服务器的资产文件夹中,在我的例子中,这是在服务器的 public 文件夹中,因为我使用的是 Laravel 后端。最后,我的图标位于路径 public/material-icons/thumb_up_black.png 中,并确保保持一致的命名约定 public/material-icons/{icon_name_color}.png 这是至关重要的一点,因为我需要再次引用这些资产。
  • 现在我们可以link带有相应项目的图标

服务器端


...

// Creating the item
new Item::create([
  'name' => 'Like-able item',
  'icon' => 'thumb_up_black',
]);

...

列表项API端点结果

[
    {
        "name": "Like-able item",
        "icon_url": "https//server-name.fancy/thumb_up_black.png"
    },
    {
        "name": "Like-able item #2",
        "icon_url": "https//server-name.fancy/thumb_up_black.png"
    },
    ....
]

第 2 步:客户端设置(Android 应用程序)

  • 一旦我使用了 API 数据并准备显示项目,我可以使用 Glide 来完成此操作。

ItemModel item = new ItemModel(itemDataFromServer);

Glide.with(context.getApplicationContext())
  .asBitmap()
  .load(MaterialIcons.getIconData(item.icon_url))
  .apply(new RequestOptions().fitCenter())
  .into(iconView);

这就是我最终解决这个问题的方法,这个实现的好处是我们可以从我们的三个客户端应用程序(Android、iOs 和 Web)中使用相同的如果不是类似的方法相应地显示。