Android 如何在工具栏上的溢出菜单中为菜单项设置字体

Android 如何在工具栏上的溢出菜单中为菜单项设置字体,android,android-menu,layout-inflater,android-inflate,android-typeface,Android,Android Menu,Layout Inflater,Android Inflate,Android Typeface,我想更改溢出菜单项的默认字体,并设置自定义字体 我尝试将工厂添加到LayoutInflater中,并在onCreateView()方法中更改了TextView的字体。但它不起作用。这是代码(在OnCreateOptions菜单中) 实际上,当我调试代码时,它从未到达onCreateView()内部 那么如何解决这个问题呢 谢谢。我就是这样解决这个问题的 步骤1:创建一个全局工厂变量并在onCreate()中初始化,如下所示 mFactory = new LayoutInflater.Fact

我想更改溢出菜单项的默认字体,并设置自定义字体

我尝试将工厂添加到
LayoutInflater
中,并在
onCreateView()
方法中更改了TextView的字体。但它不起作用。这是代码(在OnCreateOptions菜单中)

实际上,当我调试代码时,它从未到达onCreateView()内部

那么如何解决这个问题呢


谢谢。

我就是这样解决这个问题的

步骤1:创建一个全局工厂变量并在onCreate()中初始化,如下所示

  mFactory = new LayoutInflater.Factory() {
        @Override
        public View onCreateView(String name, final Context context, AttributeSet attrs) {
                try {
                    LayoutInflater li = LayoutInflater.from(context);
                    final View view = li.createView(name, null, attrs);

                    new Handler().post(new Runnable() {
                        @Override
                        public void run() {
                            ((TextView) view.findViewById(R.id.title)).setTypeface("custom_typeface");
                        }
                    });

                    return view;

                } catch (Exception e) {
                    e.printStackTrace();
                }
            return null;
        }
    };
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {

    if(name.contains("android.support.v7.view.menu.ListMenuItemView")) {
        LayoutInflater li = LayoutInflater.from(context);
        View view = null;
        try {
            view = li.createView(name, null, attrs);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if (view != null) {
            if(mFactory != null) {
                view = mFactory.onCreateView(name,context,attrs);
            }
            return view;
        }
    }
    return super.onCreateView(name, context, attrs);
}
步骤2:重写AppCompatActivity中的onCreateView()方法。 请记住,有两个oncreate()方法具有不同的签名

public View onCreateView(字符串名称、上下文上下文、属性集属性)-用于蜂窝式应用程序之前的应用程序

公共视图onCreateView(视图父对象、字符串名称、上下文上下文、属性集属性)-添加到API 11中

onCreateView的实现如下所示:

  mFactory = new LayoutInflater.Factory() {
        @Override
        public View onCreateView(String name, final Context context, AttributeSet attrs) {
                try {
                    LayoutInflater li = LayoutInflater.from(context);
                    final View view = li.createView(name, null, attrs);

                    new Handler().post(new Runnable() {
                        @Override
                        public void run() {
                            ((TextView) view.findViewById(R.id.title)).setTypeface("custom_typeface");
                        }
                    });

                    return view;

                } catch (Exception e) {
                    e.printStackTrace();
                }
            return null;
        }
    };
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {

    if(name.contains("android.support.v7.view.menu.ListMenuItemView")) {
        LayoutInflater li = LayoutInflater.from(context);
        View view = null;
        try {
            view = li.createView(name, null, attrs);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if (view != null) {
            if(mFactory != null) {
                view = mFactory.onCreateView(name,context,attrs);
            }
            return view;
        }
    }
    return super.onCreateView(name, context, attrs);
}
注意:

(1) 由于使用AppCompat支持库,我使用了而不是

(2) 因为我已经在onCreate()中初始化了一个工厂对象,所以我从onCreateOptions菜单()中删除了代码段(在我的问题中发布)。所以它只包含这一部分,

 getMenuInflater().inflate(R.menu.my_menu, menu); 
 return true;
参考资料:


嗯,这应该是显而易见的。。。你克隆了它并设置了工厂。。。但永远不要使用它…@Selvin你能解释更多吗..阅读克隆文本的文档-它创建副本。。。而且。。。用最少的逻辑思维,你应该知道你从来没有使用过这个副本