如何在工具栏上的溢出菜单中为菜单项设置字体
How to set a typeface to menu items in overflow menu on toolbar
我想更改 溢出菜单项的默认字体并设置自定义字体 。
我尝试向 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 步:创建一个全局工厂变量并在 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() 方法。
public 查看 onCreateView(字符串名称、上下文上下文、AttributeSet 属性)- 适用于 HONEYCOMB 之前的应用程序
public View onCreateView (View parent, String name, Context context, AttributeSet attrs) - 添加于 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) 我使用了 android.support.v7.view.menu.ListMenuItemView instead of com.android.internal.view.menu.IconMenuItemView 因为我使用的是 AppCompat 支持库。
(2) 因为我已经在 onCreate() 中初始化了一个 Factory 对象,所以我从 onCreateOptionsMenu() 中删除了代码段(发布在我的问题中)。所以它只包含这一部分,
getMenuInflater().inflate(R.menu.my_menu, menu);
return true;
参考文献:
How to set a font for the Options menu?
我想更改 溢出菜单项的默认字体并设置自定义字体 。
我尝试向 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 步:创建一个全局工厂变量并在 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() 方法。
public 查看 onCreateView(字符串名称、上下文上下文、AttributeSet 属性)- 适用于 HONEYCOMB 之前的应用程序
public View onCreateView (View parent, String name, Context context, AttributeSet attrs) - 添加于 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) 我使用了 android.support.v7.view.menu.ListMenuItemView instead of com.android.internal.view.menu.IconMenuItemView 因为我使用的是 AppCompat 支持库。
(2) 因为我已经在 onCreate() 中初始化了一个 Factory 对象,所以我从 onCreateOptionsMenu() 中删除了代码段(发布在我的问题中)。所以它只包含这一部分,
getMenuInflater().inflate(R.menu.my_menu, menu);
return true;
参考文献:
How to set a font for the Options menu?