Cách sử dụng các biểu tượng và biểu tượng từ Font Font Awesome Awesome trên Ứng dụng Android gốc


153

Tôi đang cố gắng sử dụng Font Awesome trên ứng dụng của mình, tôi đã có thể tích hợp phông chữ bằng cách sử dụng Typeface.createFromAsset(), nhưng tôi cũng muốn sử dụng các biểu tượng được cung cấp bởi phông chữ này, nhưng cho đến nay tôi vẫn chưa thể làm được điều đó.

Phông chữ đặc biệt này chứa các biểu tượng bên trong Vùng sử dụng riêng tư Unicode (PUA), cho những thứ như điều khiển trình phát phương tiện, truy cập hệ thống tệp, mũi tên, v.v.

Có ai đã sử dụng phông chữ có chứa các biểu tượng và biểu tượng trên Android, điều này có khả thi không?



2
Tôi đã cập nhật liên kết
Julian Suarez

23
Tôi không đồng ý rằng đây là chủ đề ngoài luồng cho Stack Overflow. Đối với tôi, có vẻ như nó phù hợp với các nguyên tắc này ( stackoverflow.com/help/on-topic ), vì nó: về một vấn đề lập trình cụ thể (cách áp dụng một biểu tượng dựa trên phông chữ cụ thể được đặt cho một nền tảng di động cụ thể) và đó là một vấn đề thực tế, có thể trả lời (xem câu trả lời của tôi dưới đây, mà tôi nghĩ minh họa điều đó).
Keith Corwin

Hãy xem repo này để triển khai phông chữ tuyệt vời trong android github.com/bperin/FontAw đũaAndroid
Brian

kiểm tra thư viện này: blog.shamanland.com/p/android-fonticon-l Library.html , nó có sẵn trên Maven Central. xem ứng dụng demo: play.google.com/store/apps/ (
Oleksii K.

Câu trả lời:


307

Font Awesome dường như hoạt động tốt với tôi trong ứng dụng Android của tôi. Tôi đã làm như sau:

  1. Sao chép fontawesome-webfont.ttfvào thư mục thử thách của tôi
  2. Tìm thấy các thực thể nhân vật cho các biểu tượng tôi muốn, sử dụng trang này: http : //fortawclaw.github.io/Font-Awemme/chcoateet /
  3. Đã tạo một mục trong chuỗi XML cho mỗi biểu tượng. Ví dụ cho một trái tim:

    <string name="icon_heart">&#xf004;</string>
  4. Tham chiếu mục nhập trong chế độ xem bố cục xml của tôi:

     <Button
         android:id="@+id/like"
         style="?android:attr/buttonStyleSmall"
         ...
         android:text="@string/icon_heart" />
    
  5. Đã tải phông chữ trong phương thức onCreate của tôi và đặt nó cho Chế độ xem phù hợp:

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

46
Ý tưởng tuyệt vời. Nhưng hãy cẩn thận với các vấn đề bộ nhớ khi liên tục tạo ra một kiểu chữ mới cho mỗi biểu tượng. Thay vào đó, hãy sử dụng một cái gì đó như Hashtableđể sử dụng lại kiểu chữ biểu tượng của bạn, như được đề xuất ở đây: code.google.com/p/android/issues/detail?id=9904#c7
saschoar


4
Tôi đã tạo một Dự án cho việc này: bitbucket.org/informatic0re/awclaw-font-iconview
Informatic0re

1
Tôi có một số vấn đề với mã của mình: Nếu tôi khai báo chuỗi strings.xmlgiống như <string name="faicon">&#xf001;</string>sau đó đặt văn bản trong mã của mình, nó sẽ ổn. Nhưng khi tôi thử mTextView.setText("&#xf004;");nó chỉ hiển thị văn bản thô. Bất cứ ai cũng có thể giúp đỡ? thks
vtproduction

2
Thêm chuỗi động vào textview như text.setText (Html.fromHtml ("& # xf000;"));
rana_sadam

29

Hãy dùng thử IcoMoon: http://icomoon.io

  • Chọn biểu tượng bạn muốn
  • Gán các ký tự cho mỗi biểu tượng
  • Tải về phông chữ

Giả sử, bạn đã chọn biểu tượng phát, gán chữ 'P' cho nó và tải tệp icomoon.ttfxuống thư mục tài sản của bạn. Đây là cách bạn hiển thị biểu tượng:

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);

Tôi đã có một cuộc nói chuyện về việc tạo ra các ứng dụng Android đẹp mắt, bao gồm giải thích về việc sử dụng phông chữ biểu tượng, cộng với việc thêm độ dốc để làm cho các biểu tượng trở nên đẹp hơn: http://www.sqisland.com/talks/beautitable-android

Giải thích về phông chữ biểu tượng bắt đầu tại slide 34: http://www.sqisland.com/talks/beautitable-android/#34


10

Có lẽ đã quá muộn nhưng tôi cũng có nhu cầu tương tự nên tôi đã xuất bản https://github.com/liltof/font-awsome-for-android Đây là phiên bản phông chữ xml sẵn sàng cho Android có thể sử dụng tuyệt vời như Keith Corwin đã nói

Hy vọng nó sẽ giúp người khác.


1
Chào mừng đến với SO. Tôi thấy mã của bạn không quá dài. Tại sao bạn không đăng nó ở câu trả lời này? Liên kết có thể sụp đổ với thời gian.
Andre Silva

Tôi đã sử dụng tệp .xml tuyệt vời này trong nhiều tuần. Nhưng bây giờ tôi đã nhận ra rằng nó nhớ fa_times. Bạn có thể vui lòng cập nhật nó? Chỉnh sửa: oh, đó là fa_remove. hoặc icon_remove trong tệp của bạn.
MobilGelistirici

Làm thế nào để thêm văn bản cũng như biểu tượng trong nút bằng phông chữ tuyệt vời? Giống như thêm drawable left hoặc drawable right trong nút.
Siddharth_Vyas

9

Như trên là ví dụ tuyệt vời và hoạt động tuyệt vời:

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

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

NHƯNG! > điều này sẽ hoạt động nếu chuỗi bên trong nút bạn đặt từ xml:

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

Nếu bạn cần thêm nó một cách linh hoạt, có thể sử dụng điều này:

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

cách tốt nhất bao giờ hết! nhờ tôi đưa ra bỏ phiếu + _ chỉ nút chú ý là TextView và thay thế String.valueOf với get chuỗi
Erfan

Cuối cùng là một giải pháp để sử dụng phông chữ tuyệt vời. Cảm ơn rất nhiều!
Clamorious 20/12/18

4

Nếu bạn muốn setText lập trình mà không cần thêm chuỗi vào chuỗi.xml

xem mã thập lục phân của nó ở đây:

http://fortawgie.github.io/Font-Awgie/chcoateet /

thay thế & # xf066; đến 0xf066

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

4

thư viện nhỏ và hữu ích được thiết kế cho mục đích này :

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

Nhận bản demo trên Google Play .

nhập mô tả hình ảnh ở đây

Bạn có thể dễ dàng thêm biểu tượng dựa trên phông chữ trong bố cục của mình:

<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"
    />

Bạn có thể thổi phồng biểu tượng phông chữ Drawabletừ xml:

<?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"
    />

Mã Java:

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

Liên kết:


thư viện thực sự tốt, cảm ơn bạn. định nghĩa xml bơm hơi là một chút đau, mặc dù vậy, tôi thích sử dụng trực tiếp FontIconView
hotzen

Tôi đã thử nghiệm điều này trên một chiếc Lenovo với Android 4.2.2 và các biểu tượng không hiển thị, có thể là gì?
Ollie Strevel

Hãy thử phiên bản mới nhất0.1.9
Oleksii K.

2

Tôi đã tạo lớp trợ giúp này trong C # (Xamarin) để lập trình thiết lập thuộc tính văn bản. Nó hoạt động khá tốt đối với tôi:

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
}

Nên đủ dễ để chuyển đổi sang Java, tôi nghĩ vậy. Hy vọng nó sẽ giúp được ai đó!


2

Một trong những thư viện mà tôi sử dụng cho Font Awesome là đây:

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

Đặc biệt,

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

Các tài liệu rất dễ hiểu.

Đầu tiên, thêm các phụ thuộc cần thiết trong build.gradle:

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

Thứ hai, bạn có thể thêm phần này vào XML của mình:

<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"
/>

nhưng hãy chắc chắn rằng bạn thêm phần này trong bố cục gốc nếu bạn muốn sử dụng ví dụ mã ở trên:

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

Tôi đã làm theo nhưng tôi đã gặp lỗi: Lỗi: (54) Không tìm thấy định danh tài nguyên nào cho thuộc tính 'fa_icon' trong gói 'xxx.yyy'
Hajjat

@Hajjat ​​để sử dụng cái này bạn cần sử dụng phiên bản 1.2.3. Tôi chỉ cập nhật mã để phản ánh điều đó. Thử nó.
Abdul Rahman A Samad

1

Thư viện FontView cho phép bạn sử dụng các ký tự phông chữ bình thường / unicode làm biểu tượng / đồ họa trong ứng dụng của bạn. Nó có thể tải phông chữ thông qua tài sản hoặc vị trí mạng.

Lợi ích của thư viện này là:

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

Thí dụ:

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);

Nó có lưu trữ đối tượng Kiểu chữ trong bộ nhớ không? Có khả năng bị rò rỉ bộ nhớ khi xử lý phông chữ trên Android.
TheRealChx101

1

Có một giải pháp hay khác mà bạn có thể sử dụng trực tiếp trong các tệp xml bố cục của mình và không cần sử dụng setTypeface.

Đó là Iconify của Joan Zapata . Bạn có thể đọc ở đây những gì mới trong Iconify v2 . Nó bao gồm 9 thư viện phông chữ khác nhau mà bạn có thể sử dụng đơn giản bằng cách thêm các phụ thuộc vào tệp build.gradle của bạn .

Trong các tệp xml bố cục, có thể chọn giữa các tiện ích này:

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

1

Ban đầu tạo thư mục tài sản và sao chép biểu tượng fontawgie (.ttf) Làm cách nào để tạo thư mục tài sản?

ứng dụng -> nhấp chuột phải -> mới -> thư mục -> thư mục tài sản

Bước tiếp theo tải về làm thế nào để tải tập tin .ttf? bấm vào đây -> và nhấp vào nút tải xuống sau khi tải xuống giải nén và mở phông chữ web. cuối cùng chọn thư mục tài sản dán kiểu văn bản thực (ttf).

Làm thế nào để thiết kế tập tin xml và java trong Android?

ứng dụng -> res -> giá trị chuỗi

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

ví dụ này về một phông chữ Unicode nữa bấm vào đây

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);

Đầu ra:

Hình ảnh đầu ra


0

Tôi đến bữa tiệc hơi muộn nhưng tôi đã viết một chế độ xem tùy chỉnh để cho phép bạn làm điều này, theo mặc định, nó được đặt thành entypo, nhưng bạn có thể sửa đổi nó để sử dụng bất kỳ iconfont nào: kiểm tra xem tại đây: github.com/MarsVard/IconView

// chỉnh sửa thư viện đã cũ và không được hỗ trợ nữa ... mới tại đây https://github.com/MarsVard/IonIconView


Thư viện của bạn không lưu bộ đệm Kiểu chữ và thay vào đó, sẽ xây dựng nó mỗi khi chế độ xem được hiển thị.
Fernando Camargo

1
@FernandoCamargo là đúng, thư viện này đã cũ và cần được cập nhật với bộ nhớ đệm tốt hơn ... đây là thư viện mới có hiệu suất tốt hơn github.com/MarsVard/IonIconView
Mars

0

Trong trường hợp bạn chỉ cần một vài biểu tượng tuyệt vời về phông chữ, bạn cũng có thể sử dụng http://fa2png.io để tạo hình ảnh pixel bình thường. Nhưng nếu bạn thường xuyên thêm các biểu tượng / nút mới, tôi khuyên dùng phiên bản .ttf vì nó linh hoạt hơn.


0

Nếu ai đó tự hỏi làm thế nào để thêm nó theo chương trình, bạn phải làm theo cách này.

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

0

Như tất cả các câu trả lời là tuyệt vời nhưng tôi không muốn sử dụng một thư viện và mỗi giải pháp chỉ với một dòng mã java làm của tôi ActivitiesFragmentsrất lộn xộn. Vì vậy, tôi đã viết TextViewlớp như sau:

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;
}
}

những gì bạn nên làm là sao chép ttftệp phông chữ vào assetsthư mục. Và sử dụng bảng cheat này để tìm từng chuỗi biểu tượng.

hi vọng điêu nay co ich.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.