有没有办法做到这一点?
是的。不提供处理此问题的NavigationView
直接方法,但可以使用View.findViewsWithText
.
有两件事可以帮助我们处理这个问题。
- 每个
MenuItem
视图都是一个TextView
. 因此,这使您的应用Typeface
变得更加容易。有关TextView
实际使用的更多信息NavigationView
,请参阅NavigationMenuItemView
。
NavigationView
选择 a时提供回调MenuItem
。我们将不得不为每个人MenuItem
提供一个唯一的 id,这个回调将帮助尽可能多地生成这些 id,这意味着以后的代码会少一些。虽然,这与您是否拥有SubMenu
.
执行
注意每个MenuItem
id 都是简单的menuItem+Position
。稍后当我们找到View
for each时,这将派上用场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>
/** The total number of menu items in the {@link NavigationView} */
private static final int MENU_ITEMS = 6;
/** Contains the {@link MenuItem} views in the {@link NavigationView} */
private final ArrayList<View> mMenuItems = new ArrayList<>(MENU_ITEMS);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
final NavigationView navView = ...
// Grab the NavigationView Menu
final Menu navMenu = navView.getMenu();
// Install an OnGlobalLayoutListener and wait for the NavigationMenu to fully initialize
navView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Remember to remove the installed OnGlobalLayoutListener
navView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// Loop through and find each MenuItem View
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);
}
// Loop through each MenuItem View and apply your custom Typeface
for (final View menuItem : mMenuItems) {
((TextView) menuItem).setTypeface(yourTypeface, Typeface.BOLD);
}
}
});
}
您可以看到使用通用MenuItem
id 如何让您利用Resources.getIdentifier
和节省几行代码。
SubMenu
警告
要记住的事情。您需要显式循环您的N
菜单项,而不是使用Menu.size
. 否则,您的SubMenu
商品将无法识别。换句话说,如果您没有SubMenu
,另一种方法是:
for (int i = 0, length = navMenu.size(); i < length; i++) {
final MenuItem item = navMenu.getItem(i);
navigationView.findViewsWithText(mMenuItems, item.getTitle(), View.FIND_VIEWS_WITH_TEXT);
}
而且您不必担心将唯一的 id 应用于每个MenuItem
.
结果

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