我使用来自design库的NavigationDrawer
compile 'com.android.support:design:24.0.0'
这里有XML
....
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main_second"
app:menu="@menu/activity_third_drawer" />
....
我正在设置菜单的位置。
app:menu="@menu/activity_third_drawer"
这里有一个菜单的XML
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_inbox"
android:icon="@drawable/ic_mail_outline_white"
android:title="@string/inbox" />
<item
android:id="@+id/nav_gallery"
android:icon="@drawable/ic_close_24dp"
android:title="@string/gallery" />
<item
android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_close_24dp"
android:title="@string/slideshow" />
<item
android:id="@+id/nav_manage"
android:icon="@drawable/ic_close_24dp"
android:title="@string/tools" />
</group>
<item android:title="@string/about_app">
<menu>
<item
android:id="@+id/nav_about"
android:icon="@drawable/ic_close_24dp"
android:title="@string/about1" />
</menu>
</item>
</menu>
最终结果应该是这样的: 但我需要当邮件到达收件箱时,它应该在
NavigationDrawer
中被标记。像这样: 有很多不同的库可以帮助解决这个问题,我选择了这个库。
这个库可以在你想要的任何地方附加徽章,但是没有一个示例告诉你如何将其附加到
<item>
。最接近的示例是如何附加到XML
。<com.readystatesoftware.viewbadger.BadgeView
android:id="@+id/badge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="OK" />
但我仍然不知道如何将它附加到<item>
。
也许还有其他的解决方案可以做到这一点?
我已经尝试过这种方式。
View menuItemView = MenuItemCompat.getActionView(navigationView.getMenu().findItem(R.id.nav_inbox));
BadgeView badge = new BadgeView(context, menuItemView);
badge.setText("1");
badge.show();
但每次我遇到 menuItemView = null
的情况。
然后我尝试了以下方法:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
View menuItemView = MenuItemCompat.getActionView(menu.findItem(R.id.nav_inbox));
BadgeView badge = new BadgeView(context, menuItemView);
badge.setText("1");
badge.show();
return super.onPrepareOptionsMenu(menu);
}
但它是相同的menuItemView = null
:
Debag
我做错了什么?
编辑
我的NavigationView
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main_second"
app:menu="@menu/activity_third_drawer" />
我的菜单
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_inbox"
android:icon="@drawable/ic_inbox_checked"
android:title="Inbox"
app:actionLayout="@layout/badge" />
</group>
<item android:title="@string/about_app">
<menu>
<item
android:id="@+id/nav_about"
android:icon="@drawable/ic_close_24dp"
android:title="@string/about1" />
</menu>
</item>
</menu>
我的徽章
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textMenuItemCount"
android:layout_width="wrap_content"
android:text="rrrr"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:textColor="@android:color/holo_blue_light"
android:textStyle="bold"
android:textSize="16sp"
android:alpha="0.6"/>
</RelativeLayout>
这是我的代码
@Override
protected void onResume() {
super.onResume();
NavigationView navView = (NavigationView) findViewById(R.id.nav_view);
MenuItem item = navView.getMenu().findItem(R.id.nav_inbox);
MenuItemCompat.setActionView(item, R.layout.badge);
RelativeLayout notifCount = (RelativeLayout) MenuItemCompat.getActionView(item);
TextView tv = (TextView) notifCount.findViewById(R.id.textMenuItemCount);
String count = "4";
if (count != null) {
tv.setText(count);
}else{
tv.setText("");
item.setEnabled(false);
}
}
这是截图调试
这是我最终得到的结果
虽然没有错误,但在调试模式下一切正常,但我看不到任何徽章。
我做错了什么?