有办法吗?
是的。 NavigationView 没有提供直接的处理方式,但可以使用 View.findViewsWithText 轻松实现。
有两件事可以帮助我们处理这个问题。
- 每个
MenuItem 视图都是一个TextView。因此,这使得应用您的Typeface 变得更加容易。有关NavigationView 实际使用的TextView 的更多信息,请参阅NavigationMenuItemView。
-
@ 987654337 provides a callback
MenuItem被选中。我们将不得不为每个MenuItem 提供一个唯一的 id,这个回调将帮助尽可能多地生成这些 id,这意味着以后的代码会少一些。不过,这与您是否拥有SubMenu 更相关。
实施
注意每个MenuItem id 都只是menuItem+Position。当我们为每个 MenuItem 查找 View 时,这将派上用场。
<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);
}
而且您不必担心为每个 MenuItem 应用唯一的 id。
结果
我在示例中使用的字体是:Smoothie Shoppe