如何更改Android菜单项的自定义字体?

我有以下 Android Java和XML代码.我想更改我的应用程序的菜单项的字体.我只知道我们可以使用setTypeface更改TextView的字体,但是无法找到菜单项.

JAVA代码

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{

    MenuInflater inflater = getMenuInflater();

    inflater.inflate(R.menu.main,menu);

    return true;

}

@Override

public boolean onoptionsItemSelected(MenuItem item) 
{

   switch (item.getItemId()) 
   {

        case R.id.action_refresh1:

            Toast.makeText(this,"Item1 Selected",Toast.LENGTH_SHORT)
            .show();

        break;

            case R.id.action_refresh2:

            Toast.makeText(this,"Item2 Selected",Toast.LENGTH_SHORT)
            .show();

        break;

        default:

        break;


  }



}

XML代码

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:id="@+id/action_refresh1"
    android:orderInCategory="100"
    android:showAsAction="always"
    android:title="Item1"/>

<item
    android:id="@+id/action_refresh2"
    android:orderInCategory="100"
    android:showAsAction="always"
    android:title="Item2"/>
</menu>

我想更改两个菜单项的字体,但不知道如何集成菜单项的settypface.

解决方法

您必须为菜单项提供自定义布局.

首先,在您的菜单中,XML设置以下之一

如果您正在使用支持库,则为CASE 1:

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_save"
        android:title="@string/action_save"
        android:icon="@drawable/ic_action_save"
        android:orderInCategory="100"
        app:showAsAction="always"
        app:actionLayout="@layout/layout_menu_save"/>
</menu>

如果您没有使用支持库,则为CASE 2:

<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/action_save"
        android:title="@string/action_save"
        android:icon="@drawable/ic_action_save"
        android:orderInCategory="100"
        android:showAsAction="always"
        android:actionLayout="@layout/layout_menu_save"/>
</menu>

然后在actionLayout(我的例子中的layout_menu_save.xml)中写下列内容

<?xml version="1.0" encoding="utf-8"?>

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

    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:background="@drawable/background_transparent_stateful">

    <com.example.YourCustomTypefaceTextView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:gravity="center_vertical"
        android:text="@string/action_save"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:gravity="center_vertical"
        android:src="@drawable/ic_action_save"
        android:contentDescription="@string/action_save"/>

</LinearLayout>

背景drawable(background_transparent_stateful)对于在您的自定义布局上有触摸反馈很有用:

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true"
        android:drawable="#20FFFFFF">
    </item>
    <item
        android:drawable="@android:color/transparent">
    </item>
</selector>

这样,您将在左侧具有带有自定义字体的文本作为右侧图标的标签.

显然,您可以根据自己的需要定制布局

编辑:
如果您正在使用支持库和您的活动主题扩展AppCompatTheme,您可以获得典型的Lollipop“涟漪效应”,以获得更好的触摸反馈.
只需替换自定义背景:

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

    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:background="?attr/selectableItemBackgroundBorderless">
    ...
</LinearLayout>

相关文章

###实现效果*本实例主要实现用ViewPage和Fragment实现选项卡...
一、安装 JDK 下载JDK最新版本,下载地址如下: http://www....
这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...