有办法吗?
是。在NavigationView不提供处理这种直接的方式,但它可以很容易地使用来实现View.findViewsWithText。
有两件事可以帮助我们解决这一问题。
- 每个
MenuItem视图都是一个TextView。因此,这使您的申请Typeface变得更加容易。有关TextView实际使用的更多信息NavigationView,请参见NavigationMenuItemView。
NavigationView MenuItem选择a时提供回调。我们将必须为每个MenuItemID提供唯一的ID,此回调将帮助尽可能多地泛化这些ID,这意味着以后需要更少的代码。虽然,这与您是否拥有更为相关SubMenu。
实作
请注意,每个MenuItemid都只是menuItem+Position。稍后我们View为每个查找时,这将派上用场MenuItem。
<group android:checkableBehavior="single">
<item
android:id="@+id/menuItem1"
android:icon="@drawable/ic_dashboard"
android:title="MenuItem 1" />
<item
android:id="@+id/menuItem2"
android:icon="@drawable/ic_event"
android:title="MenuItem 2" />
<item
android:id="@+id/menuItem3"
android:icon="@drawable/ic_headset"
android:title="MenuItem 3" />
<item
android:id="@+id/menuItem4"
android:icon="@drawable/ic_forum"
android:title="MenuItem 4" />
</group>
<item android:title="Sub items" >
<menu>
<item
android:id="@+id/menuItem5"
android:icon="@drawable/ic_dashboard"
android:title="Sub item 5" />
<item
android:id="@+id/menuItem6"
android:icon="@drawable/ic_forum"
android:title="Sub item 6" />
</menu>
</item>
private static final int MENU_ITEMS = 6;
private final ArrayList<View> mMenuItems = new ArrayList<>(MENU_ITEMS);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
final NavigationView navView = ...
final Menu navMenu = navView.getMenu();
navView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
navView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
for (int i = 0, length = MENU_ITEMS; i < length; i++) {
final String id = "menuItem" + (i + 1);
final MenuItem item = navMenu.findItem(getResources().getIdentifier(id, "id", getPackageName()));
navView.findViewsWithText(mMenuItems, item.getTitle(), View.FIND_VIEWS_WITH_TEXT);
}
for (final View menuItem : mMenuItems) {
((TextView) menuItem).setTypeface(yourTypeface, Typeface.BOLD);
}
}
});
}
您可以看到使用通用MenuItemID如何使您可以利用Resources.getIdentifier和保存几行代码。
SubMenu 警告
要记住的事情。您需要显式循环N菜单项,而不是使用Menu.size。否则,您的SubMenu商品将不会被识别。换句话说,如果您没有SubMenu,则另一种方法是:
for (int i = 0, length = navMenu.size()
final MenuItem item = navMenu.getItem(i)
navigationView.findViewsWithText(mMenuItems, item.getTitle(), View.FIND_VIEWS_WITH_TEXT)
}
而且您不必担心对每个对象应用唯一的ID MenuItem。
结果

我在示例中使用的字体是:Smoothie Shoppe