如何在本机Android应用程序上使用“ Font Awesome”中的图标和符号


153

我试图在我的应用程序上使用Font Awesome,我可以使用来集成字体Typeface.createFromAsset(),但是我也想使用该字体提供的图标,但是到目前为止,我还没有做到这一点。

这种特殊的字体在Unicode专用区(PUA)中包含图标,用于诸如媒体播放器控件,文件系统访问,箭头等操作。

在Android上是否有人使用过包含图标和符号的字体,这有可能吗?



2
我已经更新了链接
朱利安·苏亚雷斯

23
我不同意这是Stack Overflow的主题。在我看来,它符合这些(stackoverflow.com/help/on-topic)准则,因为它是:关于特定的编程问题(如何将特定的基于字体的图标集应用于特定的移动平台),这是一个实际的,可以回答的问题(请参阅下面的答案,我认为这可以说明这一点)。
基思·科温


请访问以下库:blog.shamanland.com/p/android-fonticon-library.html,该库在Maven Central上可用。看到演示应用程序:play.google.com/store/apps/...
奥莱克西K.

Answers:


307

Font Awesome在我的android应用中似乎对我来说工作正常。我做了以下事情:

  1. 复制fontawesome-webfont.ttf到我的资产文件夹中
  2. 使用此页面找到我想要的图标的字符实体: http //fortawesome.github.io/Font-Awesome/cheatsheet/
  3. 在strings.xml中为每个图标创建了一个条目。例如:

    <string name="icon_heart">&#xf004;</string>
  4. 在我的xml布局视图中引用了所说的条目:

     <Button
         android:id="@+id/like"
         style="?android:attr/buttonStyleSmall"
         ...
         android:text="@string/icon_heart" />
  5. 将字体加载到我的onCreate方法中,并将其设置为适当的视图:

    Typeface font = Typeface.createFromAsset( getAssets(), "fontawesome-webfont.ttf" );
    ...
    Button button = (Button)findViewById( R.id.like );
    button.setTypeface(font);

46
好想法。但是,当不断为每个图标创建新字体时,请注意内存问题。取而代之的是,使用类似Hashtable图标字体的方式,如此处建议的那样:code.google.com/p/android/issues/detail?
id=9904#c7



1
我的代码有一些问题:如果我以strings.xml类似的方式声明字符串,<string name="faicon">&#xf001;</string>然后在代码中设置文本,那就可以了。但是当我尝试时,mTextView.setText("&#xf004;");它仅显示原始文本。任何人都可以帮忙吗?thks
vtproduction 2015年

2
向此文本视图添加动态字符串,例如text.setText(Html.fromHtml(“&#xf000;”));
rana_sadam '16

29

试试IcoMoon:http://icomoon.io

  • 选择您想要的图标
  • 为每个图标分配字符
  • 下载字体

假设您选择了播放图标,并为其分配了字母“ P”,然后将文件下载icomoon.ttf到资产文件夹中。这是显示图标的方式:

xml:

<TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textSize="48sp"
  android:text="P" />

Java的

Typeface typeface = Typeface.createFromAsset(getAssets(), "icomoon.ttf");
textView.setTypeface(typeface);

我已经发表了有关制作漂亮的Android应用程序的演讲,其中包括有关使用图标字体的说明,以及添加渐变效果使图标更漂亮的方法:http : //www.sqisland.com/talks/beautiful-android

图标字体说明从幻灯片34开始:http : //www.sqisland.com/talks/beautiful-android/#34


10

也许为时已晚,但是我有同样的需求,所以我已经发布了这个https://github.com/liltof/font-awsome-for-android 这是android就绪的xml版本的字体,很棒,就像Keith Corwin所说的那样

希望它能帮助别人。


1
欢迎来到SO。我看到您的代码不太长。您为什么不在此答案上发布它?链接会随着时间而崩溃。
安德烈·席尔瓦

我已经使用这个伟大的.xml文件了几个星期了。但是现在我意识到它错过了fa_times。你能更新一下吗?编辑:哦,这是fa_remove。或文件中的icon_remove。
mobilGelistirici

如何使用真棒字体在按钮中添加文本和图标?就像在按钮中添加可绘制的左侧或可绘制的右侧。
Siddharth_Vyas

9

上面是一个很好的例子,效果很好:

Typeface font = Typeface.createFromAsset(getAssets(), "fontawesome-webfont.ttf" );

Button button = (Button)findViewById( R.id.like );
button.setTypeface(font);

但!>如果您通过xml设置了按钮内的字符串,这将起作用:

<string name="icon_heart">&#xf004;</string>
button.setText(getString(R.string.icon_heart));

如果您需要动态添加它,可以使用以下命令:

String iconHeart = "&#xf004;";
String valHexStr = iconHeart.replace("&#x", "").replace(";", "");
long valLong = Long.parseLong(valHexStr,16);
button.setText((char) valLong + "");

有史以来最好的方法!谢谢我给+投票_只是注意按钮是textview,并用get string替换String.valueOf
erfan 18-02-09

最后是一个使用字体的解决方案。非常感谢!
Clamorious

4

如果要编程的setText而不将字符串添加到string.xml

在此处查看其十六进制代码:

http://fortawesome.github.io/Font-Awesome/cheatsheet/

替换&#xf066; 至0xf066

 Typeface typeface = Typeface.createFromAsset(getAssets(), "fontawesome-webfont.ttf");
    textView.setTypeface(typeface);
    textView.setText(new String(new char[]{0xf006 }));

4

为此目的设计了一个小型且有用的

dependencies {
    compile 'com.shamanland:fonticon:0.1.9'
}

Google Play上获取演示。

在此处输入图片说明

您可以在布局中轻松添加基于字体的图标:

<com.shamanland.fonticon.FontIconView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/ic_android"
    android:textSize="@dimen/icon_size"
    android:textColor="@color/icon_color"
    />

您可以Drawable从xml 扩展font-icon :

<?xml version="1.0" encoding="utf-8"?>
<font-icon
    xmlns:android="http://schemas.android.com/apk/res-auto"
    android:text="@string/ic_android"
    android:textSize="@dimen/big_icon_size"
    android:textColor="@color/green_170"
    />

Java代码:

Drawable icon = FontIconDrawable.inflate(getResources(), R.xml.ic_android);

链接:


真的很好的图书馆,谢谢。充气式xml-definitions有点麻烦,我更喜欢直接使用FontIconView
hotzen 2014年

我在装有Android 4.2.2的Lenovo中进行了测试,但图标没有出现,怎么办?
Ollie Strevel '17

试用最新版本0.1.9
Oleksii K.

2

我在C#(Xamarin)中创建了此帮助器类,以编程方式设置了text属性。它对我来说效果很好:

internal static class FontAwesomeManager
{
    private static readonly Typeface AwesomeFont = Typeface.CreateFromAsset(App.Application.Context.Assets, "FontAwesome.ttf");

    private static readonly Dictionary<FontAwesomeIcon, string> IconMap = new Dictionary<FontAwesomeIcon, string>
    {
        {FontAwesomeIcon.Bars, "\uf0c9"},
        {FontAwesomeIcon.Calendar, "\uf073"},
        {FontAwesomeIcon.Child, "\uf1ae"},
        {FontAwesomeIcon.Cog, "\uf013"},
        {FontAwesomeIcon.Eye, "\uf06e"},
        {FontAwesomeIcon.Filter, "\uf0b0"},
        {FontAwesomeIcon.Link, "\uf0c1"},
        {FontAwesomeIcon.ListOrderedList, "\uf0cb"},
        {FontAwesomeIcon.PencilSquareOutline, "\uf044"},
        {FontAwesomeIcon.Picture, "\uf03e"},
        {FontAwesomeIcon.PlayCircleOutline, "\uf01d"},
        {FontAwesomeIcon.SignOut, "\uf08b"},
        {FontAwesomeIcon.Sliders, "\uf1de"}
    };

    public static void Awesomify(this TextView view, FontAwesomeIcon icon)
    {
        var iconString = IconMap[icon];

        view.Text = iconString;
        view.SetTypeface(AwesomeFont, TypefaceStyle.Normal);
    }
}

enum FontAwesomeIcon
{
    Bars,
    Calendar,
    Child,
    Cog,
    Eye,
    Filter,
    Link,
    ListOrderedList,
    PencilSquareOutline,
    Picture,
    PlayCircleOutline,
    SignOut,
    Sliders
}

我认为应该足够容易地转换为Java。希望它能对某人有所帮助!


2

我用于Font Awesome的库之一是:

https://github.com/Bearded-Hen/Android-Bootstrap

特别,

https://github.com/Bearded-Hen/Android-Bootstrap/wiki/Font-Awesome-Text

该文档很容易理解。

首先,在build.gradle中添加所需的依赖项:

dependencies {
    compile 'com.beardedhen:androidbootstrap:1.2.3'
}

其次,您可以在XML中添加它:

<com.beardedhen.androidbootstrap.FontAwesomeText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    fontawesometext:fa_icon="fa-github"
    android:layout_margin="10dp" 
    android:textSize="32sp"
/>

但是如果要使用上面的代码示例,请确保将其添加到根目录中:

    xmlns:fontawesometext="http://schemas.android.com/apk/res-auto"

我遵循了这个规则,但出现了错误:错误:(54)在包xxx.yyy中找不到属性“ fa_icon”的资源标识符
Hajjat

@Hajjat​​要使用此版本,您需要使用版本1.2.3。我只是更新了代码以反映这一点。试试吧。
Abdul Rahman A Samad '02

1

FontView库可让您在应用程序中使用普通/ Unicode字体字符作为图标/图形。它可以通过资产或网络位置加载字体。

该库的好处是:

1 - it takes care of remote resources for you
2 - scales the font size in dynamically sized views
3 - allows the font to easily be styled.

https://github.com/shellum/fontView

例:

Layout:

<com.finalhack.fontview.FontView
        android:id="@+id/someActionIcon"
        android:layout_width="80dp"
        android:layout_height="80dp" />

Java:

fontView.setupFont("fonts/font.ttf", character, FontView.ImageType.CIRCLE);
fontView.addForegroundColor(Color.RED);
fontView.addBackgroundColor(Color.WHITE);

是否将Typeface对象缓存在内存中?在Android上处理字体时,已知存在内存泄漏的可能性。
TheRealChx101

1

还有另一个不错的解决方案,您可以直接在布局xml文件中使用它,而无需使用setTypeface

这是琼·扎帕塔(Joan Zapata)的Iconify。您可以在此处阅读Iconify v2的新增功能。它包括9种不同的字体库,您可以通过将依赖项添加到build.gradle文件中来简单地使用它们

在布局xml文件中,可以在以下窗口小部件之间进行选择:

com.joanzapata.iconify.widget.IconTextview
com.joanzapata.iconify.widget.IconButton
com.joanzapata.iconify.widget.IconToggleButton

1

最初创建资产文件夹并复制fontawesome图标(.ttf)如何创建资产文件夹?

应用->右键单击->新建->文件夹->资产文件夹

下一步下载如何下载.ttf文件? 单击此处->,然后在下载解压缩并打开Web字体后单击下载按钮。最后选择真实文本样式(ttf)粘贴资产文件夹。

如何在android中设计xml和java文件?

app-> res->值string.xml

resources
    string name="calander_font" >&#xf073; <string
resources

此示例使用一种更多Unicode字体,请点击此处

Activity_main.xml

 <TextView
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:id="@+id/calander_view"/>

MainActivity.java

calander_tv = (TextView)findViewById(R.id.calander_view);

Typeface typeface = Typeface.createFromAsset(getAssets(),"/fonts/fa-solid-900.ttf");
calander_tv.setTypeface(typeface);
calander_tv.setText(R.string.calander_font);

输出:

输出图像


0

我参加聚会有点晚了,但是我写了一个自定义视图,让您执行此操作,默认情况下将其设置为entypo,但是您可以将其修改为使用任何iconfont:在此处查看:github.com/MarsVard/IconView

//编辑该库是旧的,不再受支持...此处是新库https://github.com/MarsVard/IonIconView


您的库没有缓存Typeface,而是在每次渲染视图时构造它。
Fernando Camargo 2014年

1
@FernandoCamargo是正确的,该库很旧,应该使用更好的缓存进行更新...这是性能更好的新库github.com/MarsVard/IonIconView
Mars

0

如果只需要一些字体真棒图标,则还可以使用http://fa2png.io生成普通像素图像。但是,如果您定期添加新的图标/按钮,我建议您使用.ttf版本,因为它更加灵活。


0

如果有人想知道如何以编程方式添加它,那么您必须这样做。

   button_info.setText(R.string.icon_heart);
    button_info.append(" Hallo"); //<<--- This is the tricky part

0

由于所有的答案都是伟大的,但我不想使用图书馆和每个解决方案只用一行java代码让我ActivitiesFragments很凌乱。因此,我将TextView类编写如下:

public class FontAwesomeTextView extends TextView {
private static final String TAG = "TextViewFontAwesome";
public FontAwesomeTextView(Context context) {
    super(context);
    init();
}

public FontAwesomeTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public FontAwesomeTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public FontAwesomeTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init();
}

private void setCustomFont(Context ctx, AttributeSet attrs) {
    TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
    String customFont = a.getString(R.styleable.TextViewPlus_customFont);
    setCustomFont(ctx, customFont);
    a.recycle();
}

private void init() {
    if (!isInEditMode()) {
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fontawesome-webfont.ttf");
        setTypeface(tf);
    }
}

public boolean setCustomFont(Context ctx, String asset) {
    Typeface typeface = null;
    try {
        typeface = Typeface.createFromAsset(ctx.getAssets(), asset);
    } catch (Exception e) {
        Log.e(TAG, "Unable to load typeface: "+e.getMessage());
        return false;
    }

    setTypeface(typeface);
    return true;
}
}

您应该做的是将字体ttf文件复制到assets文件夹中,并使用该备忘单查找每个图标字符串。

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.