在最低API级别为14的应用中使用Roboto字体。

19

我有一个应用程序,最低API级别是14。我是否正确地认为所有兼容的设备都应该默认安装Roboto字体?如果我将textView字体设置为Roboto或Roboto Light,则似乎会默认使用普通的sans字体。

有没有一种方法可以在不包含Roboto字体作为资源的情况下使用Roboto?


我认为我们做不到这个。 - Qadir Hussain
1
为什么不将.ttf文件添加到您的资源中,并将其用作“TypeFace”?(如果我正确理解了您的问题) - Rotary Heart
我不想将Roboto字体作为资源包含在我的应用程序中,因为我的应用程序的最低API级别为14,所以Roboto应该已经存在于兼容设备上了。 - Milo
1个回答

58

有没有一种方法可以在不作为资产包含Roboto字体的情况下使用Roboto?

对于API 11<,没有其他方法可以做到这一点。

我通常会为机器人字体创建自定义TextView:

public class TextView_Roboto extends TextView {

        public TextView_Roboto(Context context, AttributeSet attrs, int defStyle) {
                super(context, attrs, defStyle);
                createFont();
        }

        public TextView_Roboto(Context context, AttributeSet attrs) {
                super(context, attrs);
                createFont();
        }

        public TextView_Roboto(Context context) {
                super(context);
                createFont();
        }

        public void createFont() {
                Typeface font = Typeface.createFromAsset(getContext().getAssets(), "robo_font.ttf");
                setTypeface(font);
        }
}

现在您可以像这样在您的布局中使用它:

<com.my.package.TextView_Roboto>
  android:layout_width="..."
  android:layout_height="..."
  [...]
</com.my.package.TextView_Roboto>

当然,您可以创建一个TextView布局。一个用于Pre HC,一个用于HC及以上版本(您需要利用layout和layout-v11文件夹)。现在,您可以使用<include>标签将TextView包含在您的布局中。您只需要这样使用:

if (android.os.Build.VERSION.SDK_INT >= 11){
    TextView txt = (TextView) findViewById(R.id.myTxtView);
}
else{
    TextView_Roboto txt = (TextView_Roboto) findViewById(R.id.myTxtView);
}

编辑:

您可以像这样在 Android 4.1+ 中直接使用 Roboto:

android:fontFamily="sans-serif"           // roboto regular
android:fontFamily="sans-serif-light"     // roboto light
android:fontFamily="sans-serif-condensed" // roboto condensed

@ZsoltSafrany 嗯,不知道我为什么那样做。谢谢你指出来。我已经编辑了答案。 - Ahmad
11
三星手机是目前最受欢迎的安卓手机品牌。虽然所有4.1及以上版本的三星手机都有Roboto字体,但它们还有一种称为Samsung Sans的字体,如果您的用户将其设置为默认字体,则android:font-family请求将返回Samsung Sans而不是Roboto。如果您的布局非常紧凑无法伸展,Samsung Sans会破坏它们。听起来Milo已经发现了这个问题的变体。没有简单的解决方法。如果您必须使用Roboto,则必须将其打包为资源并显式地设置为字体样式。 - Kenton Price
警告:按照上述方式使用“TextView_Roboto”自定义视图很可能会导致本地堆内存泄漏(请参见此处)。应该与自定义文本视图一起实现“字体缓存”,以防止潜在的内存泄漏-有关详细信息,请参见此处 - James B
@geekoraul 你是指内置于Android框架中的字体吗? - Ahmad
@JamesB 谢谢您的补充!我将编辑答案以包含那个。 - Ahmad
显示剩余6条评论

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