Android Jetpack Compose图标库中缺少一些Material图标。

99

androidx.compose.material.icons.Icons中有许多常用的Material图标,但是有些缺失。举个例子,就没有打印图标

...

import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Menu  // ok
import androidx.compose.material.icons.filled.Print // error, unresolved reference

@Composable
fun IconsExample() {
    Icon(Icons.Filled.Menu, "menu")   // ok
    Icon(Icons.Filled.Print, "print") // error, unresolved reference
}

在应用程序中使用那些缺失的图标的最简单方法是什么?

2个回答

216

有一个单独的依赖项material-icons-extended,其中包含完整的材料图标列表,只需将其添加到您的应用程序的build.gradle中即可。

dependencies {
  ...
  implementation "androidx.compose.material:material-icons-extended:$compose_version"
}

现在您可以使用任何材料图标,例如:

...

import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Menu  // ok
import androidx.compose.material.icons.filled.Print // ok

@Composable
fun IconsExample() {
    Icon(Icons.Filled.Menu, "menu")   // ok
    Icon(Icons.Filled.Print, "print") // ok
}

关于构件大小的说明:由于该构件包含多个主题的所有 Material 图标,因此它是一个相当大的依赖项,在 1.0.0-alpha10 版中的 aar 大小为 18MB。在 Maven 存储库上有一条注释,建议不要直接使用它:

该模块包含所有 Material 图标。它是一个非常大的依赖项,不应直接包含。

考虑到大多数 Android 项目在发布构建时启用了代码缩减,这样一个巨大的依赖项不会影响发布构建的大小,但它可能会影响您的调试构建和设备上传时间,尽管我不确定影响是否显著。实际上,许多Compose 示例都使用了该依赖项。

如果只需要一些额外的图标而您决定不使用 material-icons-extended 构件,则可以轻松将这些图标添加到您的项目资源中,使用 Android Studio。您可以像这样使用这些资源图标:

...

import com.mycompany.myproject.R
import androidx.compose.ui.res.painterResource

@Composable
fun ResourceIconExample() {
    Icon(
        painter = painterResource(R.drawable.ic_baseline_print_24),
        contentDescription = "print"
    )
}

2
看起来谷歌建议不要像存储库中所述那样包含整个扩展图标集。你知道我们是否只能添加需要的其他图标吗? - Jesse Hill
3
谢谢您的留言,我已经更新了答案并添加了一些额外的信息,包括一个不使用 material-icons-extended 的图标示例。希望这能够帮到您! - Valeriy Katkov
1
请标记此答案为可接受的答案。 - Androbito
3
我即使使用了扩展依赖项,仍然无法看到问号符号(https://fonts.google.com/icons?selected=Material%20Icons%20Outlined%3Aquestion_mark%3A)。 - Barry Irvine
2
非常好的答案,谢谢。为了获得一些图标,我制作了一个独立的Compose应用程序,包含了material_icons_extended,跳转到我想要的图标的定义,并将代码复制到我的项目中。我将其放在我们自己的命名空间中,以便我可以跟踪使用了哪些图标等。有点麻烦,但开销很小!每个图标只是一个私有和公共属性,就这样。 - Robert Jeppesen
显示剩余2条评论

1

我想补充之前的评论,你不仅可以使用painterResource,而且还可以使用ImageVector。这样,您就可以在组合函数中使用相同的类型参数。 ImageBitmap vs ImageVector

val imageVector = ImageVector.vectorResource(id = R.drawable.baseline_shopping_cart_24)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接