&引用;如何修复';java.lang.IllegalArgumentException:字体已添加';Android Q中的错误?“;

&引用;如何修复';java.lang.IllegalArgumentException:字体已添加';Android Q中的错误?“;,android,Android,我必须尝试Android Q中的新功能(在Android Q和AppCompat v1.1.0中默认情况下断字是关闭的),我也阅读了文档。当我按照安卓博客中的说明操作时,效果很好,但当我尝试按照文档操作时,我发现了错误 我只使用单一字体系列。下面的代码正在运行: tvTest.typeface = Typeface.CustomFallbackBuilder( FontFamily.Builder( Font.Builder(resourc

我必须尝试Android Q中的新功能(在Android Q和AppCompat v1.1.0中默认情况下断字是关闭的),我也阅读了文档。当我按照安卓博客中的说明操作时,效果很好,但当我尝试按照文档操作时,我发现了错误

我只使用单一字体系列。下面的代码正在运行:

tvTest.typeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(resources.assets, "aguafina_script.ttf").build()).build())
        .addCustomFallback(FontFamily.Builder(
                Font.Builder(resources.assets, "Font_Solid_900.otf").build()).build())
        .build()
但是,当我尝试添加多个字体系列时,出现了错误

  Font regularFont = new Font.Builder("regular.ttf").build();
  Font boldFont = new Font.Builder("bold.ttf").build();
  FontFamily family = new FontFamily.Builder(regularFont)
      .addFont(boldFont).build();
  Typeface typeface = new Typeface.CustomFallbackBuilder(family)
      .setWeight(Font.FONT_WEIGHT_BOLD)  // Set bold style as the default style.
                                         // If the font family doesn't have bold style font,
                                         // system will select the closest font.
      .build();
文件中给出了上述代码


那么你能帮我解决这个错误吗?

免责声明:我的情况和你的不一样,但错误是一样的。我只是想帮助任何人解决这个问题,因为这是唯一一个提到错误的问题。也许这也有助于行动

事实证明,罪魁祸首是我的字体系列xml文件。尽管我的文件在Android 9及以下版本中功能完善,但在Android 10(Q)中却失败了。原因是我将不止一种fontStyles定义为“正常”:


在我把它改成只有一个“正常”后,它工作得很好

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">

    <font
        app:fontStyle="normal"
        app:font="@font/dosis_regular"/>

    <font
        app:fontWeight="700"
        app:font="@font/dosis_bold"/>

    <font
        app:fontStyle="italic"
        app:font="@font/dosis_light"/>

</font-family>

1)单击应用程序作为根文件夹,右键单击它并选择:新建->文件夹->创建资产文件夹, 您将得到一个对话框:为资产创建源根目录

2) 在资产文件夹中包括.ttf文件

3) 在您的活动或片段中使用

TextView name = (TextView) findViewById(R.id.tv_date);
    Typeface pick_text = Typeface.createFromAsset(itemView.getContext().getAssets(),  "fonts/OpenSans-Semibold.ttf");
    name.setTypeface(pick_text);

    TextView desc = (TextView) findViewById(R.id.tv_orderid);
    Typeface desc_text = Typeface.createFromAsset(itemView.getContext().getAssets(),  "fonts/NevisBold-KGwl.ttf");
    desc.setTypeface(desc_text);

在androidx.core(或core ktx)1.2.0及更高版本的Android 10中,当您尝试将具有相同样式和重量的多个字体注册到同一字体系列中时,会出现此错误

尽管您的示例是以编程方式创建字体系列,但大多数开发人员在使用字体XML时都会遇到此错误,所以让我们从这个开始

在字体XML中,不能有多个
font
元素具有相同的
fontStyle
fontWeight
属性。例如,以下XML会导致此错误,因为两个
font
元素的样式和权重值相同:


尽管
font
的值不同(
@font/gibson_regular
@font/gibson_bold
),但
fontStyle
fontwweight
是相同的,因此会导致错误

另外,请注意,如果不提供
fontStyle
fontwweight
属性,则它们分别默认为
normal
400
,因此下一个示例也失败:


要解决此问题,请确保每个
font
元素的
fontStyle
fontwweight
组合是唯一的。例如,如果我们为
gibson_bold
字体正确设置
fontWeight
,我们将避免错误:


现在,当以编程的方式构建这个时,正如上面所述,同样的规则也适用。看起来您引用的API文档没有更新到与源代码实际执行的操作相匹配的程度。下面是您的示例现在的样子:

val regularFont:Font=Font.Builder(resources.assets,“regular.ttf”).build()
val boldFont:Font=Font.Builder(resources.assets,“bold.ttf”).build()
val family:FontFamily=FontFamily.Builder(regularFont).addFont(boldFont).build()
val字体:字体=CustomFallbackBuilder(系列)
.setStyle(字体样式(字体大小粗体,字体倾斜竖直))
.build()
当以这样的编程方式编写时,Android似乎在通过
Font.Builder
加载字体时正确地记录了字体的重量和样式,因此只要
regular.ttf
bold.ttf
的重量和样式不同,此代码就可以正常工作

但是,如果两种字体具有相同的重量和样式,或者如果手动指定字体和样式相同,例如如果要调用粗体字体上的
setWeight(400)
,则仍然会出现此异常


总之,使用字体XML时,始终为每种字体指定
fontStyle
fontwweight
。无论您是使用XML编写内容还是以编程方式构建内容,请确保字体族中每种字体的权重和样式组合都是唯一的

请发布完整的错误日志..java.lang.IllegalArgumentException:Font{path=null,style=FontStyle{weight=400,sland=0},ttcIndex=0,axes=,localeList=,buffer=java.nio.DirectByteBuffer[pos=0 lim=6565656568 cap=65656568]}已在android.graphics.fonts.FontFamily$Builder.addFont(FontFamily.java:100)中添加在我们的一个模块中添加了
androidx.core:core-ktx:1.2.0
依赖项之后,Android 10才开始出现这种情况。删除此依赖项或您的解决方案都可以为我们解决崩溃问题。谢谢@Dave Leeds。解释得很好的回答。回答得好。我必须使用两种字体来支持api 25和更低版本。改变字体的重量对我有用,我欠你我的理智,先生。
TextView name = (TextView) findViewById(R.id.tv_date);
    Typeface pick_text = Typeface.createFromAsset(itemView.getContext().getAssets(),  "fonts/OpenSans-Semibold.ttf");
    name.setTypeface(pick_text);

    TextView desc = (TextView) findViewById(R.id.tv_orderid);
    Typeface desc_text = Typeface.createFromAsset(itemView.getContext().getAssets(),  "fonts/NevisBold-KGwl.ttf");
    desc.setTypeface(desc_text);