有办法吗?
是。在NavigationView
不提供处理这种直接的方式,但它可以很容易地使用来实现View.findViewsWithText
。
有两件事可以帮助我们解决这一问题。
- 每个
MenuItem
视图都是一个TextView
。因此,这使您的申请Typeface
变得更加容易。有关TextView
实际使用的更多信息NavigationView
,请参见NavigationMenuItemView
。
NavigationView
MenuItem
选择a时提供回调。我们将必须为每个MenuItem
ID提供唯一的ID,此回调将帮助尽可能多地泛化这些ID,这意味着以后需要更少的代码。虽然,这与您是否拥有更为相关SubMenu
。
实作
请注意,每个MenuItem
id都只是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);
}
}
});
}
您可以看到使用通用MenuItem
ID如何使您可以利用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