Android 在菜单项中使用 font-awesome 字体作为图标

标签 android font-awesome

我只是在学习 android,很抱歉我缺乏这方面的知识。我主要是一名 Web 开发人员,我们一直使用 Font Awesome,所以我试图让它与 Android 一起工作。我第一次发现我可以使用很棒的字体 here .通过更深入的搜索,我发现了如何在标题 here 的操作菜单栏中放置一个很棒的字体图标。 .我错过了在有空间时通过设置标题而不是图标和标题来拥有备份文本的能力。

我想知道我是否可以将图标设置为 awesome 字体而不是标题,并且标题只有正常的描述性文本。当我在菜单项上执行 setIcon 方法时,它需要一个可绘制或可绘制资源 ID。我可以将它转换为可绘制对象吗?保持图标的字体很棒并同时拥有图标和标题的最佳方法是什么?感谢任何帮助或指导。

所以我的主要 Activity 中有以下代码:

public class MainActivity extends AppCompatActivity {

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // https://stackoverflow.com/a/32780748/2066736
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setLogo(R.drawable.redbird_webkit_onwht);
        getSupportActionBar().setDisplayUseLogoEnabled(true);

        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_menu, menu);

        setFontAwesomeMenuItem(menu, R.string.icon_calendar, R.id.action_calendar);
        setFontAwesomeMenuItem(menu, R.string.icon_search, R.id.action_search);
        setFontAwesomeMenuItem(menu, R.string.icon_plus, R.id.action_new_post);

        // menu.add(0, MENU_ITEM_LOGOUT, 102, R.string.logout);

        return true;
    }

    private void setFontAwesomeMenuItem (Menu menu, int rIdString, int rIdIdOfElement) {
        SpannableString s = new SpannableString(getString(rIdString));
        s.setSpan(new TypefaceSpan(this, "fontawesome-webfont.ttf"), 0, s.length(),
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        menu.findItem(rIdIdOfElement).setTitle(s);
    }
}

我从 here 得到了以下 TypefaceSpan 类:

/**
 * Style a {@link Spannable} with a custom {@link Typeface}.
 *
 * @author Tristan Waddington
 * copied from https://stackoverflow.com/a/15181195/2066736
 */
public class TypefaceSpan extends MetricAffectingSpan {
    /** An <code>LruCache</code> for previously loaded typefaces. */
    private static LruCache<String, Typeface> sTypefaceCache =
            new LruCache<String, Typeface>(12);

    private Typeface mTypeface;

    /**
     * Load the {@link Typeface} and apply to a {@link Spannable}.
     */
    public TypefaceSpan(Context context, String typefaceName) {
        mTypeface = sTypefaceCache.get(typefaceName);

        if (mTypeface == null) {
            mTypeface = Typeface.createFromAsset(context.getApplicationContext()
                    .getAssets(), String.format("fonts/%s", typefaceName));

            // Cache the loaded Typeface
            sTypefaceCache.put(typefaceName, mTypeface);
        }
    }

    @Override
    public void updateMeasureState(TextPaint p) {
        p.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }
}

最佳答案

答案来晚了,但对于 future 的访问者来说,有一个很棒的库可以在 android 中使用很棒的字体,称为 iconify,由 JoanZapata 编写.你可以找到它here

库被正确初始化后,你可以用你的 ActionBar 菜单项做这样的事情:

<menu xmlns:android="http://schemas.android.com/apk/res/android"

   <item
       android:id="@+id/item_menu
       showAsAction="always"
       android:title="@string/title"/>

</menu>

从 java 代码你只需要做这样的事情:

 menu.findItem(R.id.item_menu).setIcon(
    new IconDrawable(this, FontAwesomeIcons.fa_share)
    .colorRes(R.color.ab_icon)
    .actionBarSize());

希望这会对某人有所帮助 :) 如果您有任何问题,请询问 :)

关于Android 在菜单项中使用 font-awesome 字体作为图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40391520/

相关文章:

c# - Xamarin Android 异步等待不等待方法

java - 使用 okhttp 将文本和多个图像作为数组传递

java - 下载 PDF 并将其保存在 SD 卡上未找到

java - 导入附加库后 Android Studio gradle 错误 - smack

font-awesome - 在 fontawesome 图标中放置文本

html - FontAwesome 5 - 多色图标

html - 模板站点未正确导入字体和图标

android - AVD 启动过程中的错误消息

html - Font Awesome 列表填充

reactjs - 将 Font Awesome Pro 添加到 React 应用程序 - 入门