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

我尝试将Factory添加到LayoutInflater,并在onCreateView()方法中更改了TextView的字体。但这没有用。这是代码(在onCreateOptionsMenu内部),

getLayoutInflater().cloneInContext(this).setFactory(new LayoutInflater.Factory() {
        @Override
        public View onCreateView(String name, Context context, AttributeSet attrs) {

            if (name.contains("com.android.internal.view.menu.IconMenuItemView")) {
                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).setTypeface("custom_typeface");
                        }
                    });
                    return view;

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    });


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

那么如何解决呢?

谢谢。

最佳答案

这就是我解决这个问题的方法,

第1步:创建一个全局Factory变量,并在如下所示的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;
        }
    };


步骤2:在AppCompatActivity中重写onCreateView()方法。
请记住,有2个具有不同签名的oncreate()方法。

公共视图onCreateView(字符串名称,上下文上下文,AttributeSet属性)-适用于HONEYCOMB之前的应用

公共视图onCreateView(视图父级,字符串名称,上下文上下文,AttributeSet属性)-已在API 11中添加。

onCreateView的实现如下所示,

@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支持库,所以我使用的是android.support.v7.view.menu.ListMenuItemView而不是com.android.internal.view.menu.IconMenuItemView

(2)由于我已经在onCreate()中初始化了Factory对象,因此我从onCreateOptionsMenu()中删除了代码段(在我的问题中发布)。所以它只包含这部分,

 getMenuInflater().inflate(R.menu.my_menu, menu);
 return true;


参考文献:

How to set a font for the Options menu?

Android Menu item font using LayoutInflaterCompat.setFactory

关于android - 如何在工具栏上的溢出菜单中的菜单项上设置字体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35551787/

10-10 20:21