如何在NavigationView中动态添加自定义MenuItem?

时间:2015-12-10 13:10:21

标签: java android navigationview

我正在开发一个包含动态生成菜单的应用程序:

private void cargarAvisosMenu() 
    {
        // Menu
        final Menu menu = this.mNavigationView.getMenu();


        // Carga de datos
        CentroSelection selection = new CentroSelection();
        CentroCursor cur = selection.query(getApplicationContext().getContentResolver());

        // Recorro el cursor de centros
        while (cur.moveToNext()) {
            boolean avisosTipoA = false;
            boolean avisosTipoB = false;

            Centro c = Centro.getFromCursor(cur);
            if (c.getIsTipoAVisible() && c.getComponenteTipoA().getControlesTipoAPendientes() > 0) {
                avisosTipoA = true;
            }
            if (c.getIsTipoBVisible() && c.getComponenteTipoB().getControlesTipoBPendientes() > 0){
                avisosTipoB = true;
            }

            if (avisosTipoA || avisosTipoB) {
                // Añado la sección y los items.
                final SubMenu subMenu = menu.addSubMenu(c.getNombre());
                if (avisosTipoA) {
                    subMenu.add("TipoA").setIcon(R.drawable.ic_tipoA);
                }
                if (avisosTipoB) {
                    subMenu.add("TipoB").setIcon(R.drawable.ic_tipoB);
                }
            }
        }
    }

我想为MenuItem添加一个包含许多通知的计数器(作为gmail)。

根据this post可信:

  

NavigationView提供了一种构建导航抽屉的便捷方式,   包括使用菜单XML文件创建菜单项的功能。   我们通过设置功能扩展了可能的功能   通过app:actionLayout或使用自定义项目视图   MenuItemCompat.setActionView()。

在我开发动态菜单时,我尝试使用第二个选项MenuItemCompat.setActionView()

 private void cargarAvisosMenu() 
    {
        // Menu
        final Menu menu = this.mNavigationView.getMenu();


        // Carga de datos
        CentroSelection selection = new CentroSelection();
        CentroCursor cur = selection.query(getApplicationContext().getContentResolver());

        // Recorro el cursor de centros
        while (cur.moveToNext()) {
            boolean avisosTipoA = false;
            boolean avisosTipoB = false;

            Centro c = Centro.getFromCursor(cur);
            if (c.getIsTipoAVisible() && c.getComponenteTipoA().getControlesTipoAPendientes() > 0) {
                avisosTipoA = true;
            }
            if (c.getIsTipoBVisible() && c.getComponenteTipoB().getControlesTipoBPendientes() > 0){
                avisosTipoB = true;
            }

            if (avisosTipoA || avisosTipoB) {
                // Añado la sección y los items.
                final SubMenu subMenu = menu.addSubMenu(c.getNombre());
                if (avisosTipoA) {
                    subMenu.add("TipoA").setIcon(R.drawable.ic_tipoA);
                }
                if (avisosTipoB) {
                    // subMenu.add("TipoB").setIcon(R.drawable.ic_tipoB);
                    int itemId = subMenu.add("TipoB").getItemId();
                    View menuItem = MenuItemCompat.setActionView(subMenu.findItem(itemId), R.layout.menu_notificaciones).getActionView();
                    ((ImageView) menuItem.findViewById(R.id.ivMenuNotificaciones)).setBackground(getDrawable(R.drawable.ic_barcode));
                    ((TextView) menuItem.findViewById(R.id.tvMenuNotificaciones)).setText("TipoB");
                    ((TextView) menuItem.findViewById(R.id.tvContadorNotificaciones)).setText("100");
                }
            }
        }
    }

" menu_notificaciones.xml":

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/ivMenuNotificaciones"
            android:layout_width="64dp"
            android:layout_height="match_parent" />
        <TextView
            android:id="@+id/tvMenuNotificaciones"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />
        <TextView
            android:id="@+id/tvContadorNotificaciones"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="right"/>
    </LinearLayout>

但它没有用。

2 个答案:

答案 0 :(得分:0)

更重要的是使用lib版本v7:23.1.1

使用compile&#39; com.android.support:appcompat-v7:23.1.1&#39;

菜单项

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<group android:checkableBehavior="single" android:id="@+id/root_group">
    <item android:id="@+id/nav_switch"
        app:actionLayout="@layout/action_view_switch"
        android:title="Downloaded only" />
    <item android:title="You" android:id="@+id/you_parent_item">
        <menu android:id="@+id/you_menu">
            <group android:checkableBehavior="single" android:id="@+id/you_group">
                <item
                    android:id="@+id/item_you_summary"
                    android:title="Summary Detail" />
                <item
                    android:id="@+id/item_calendar"
                    android:title="Calendar" />

            </group>
        </menu >
    </item>
    <item android:title="Your People" android:id="@+id/your_parent_item">
        <menu android:id="@+id/your_menu">
            <group android:checkableBehavior="single" android:id="@+id/your_group">
                <item
                    android:id="@+id/your_item_sumary"
                    android:title="View Summary" />
                <item
                    android:id="@+id/item_record_timeout"
                    android:title="Record TimeOut" />
            </group>
        </menu>
    </item>

</group>

通过app:actionLayout

自定义项目视图
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="horizontal" android:layout_width="match_parent"

android:layout_height="match_parent">



<android.support.v7.widget.SwitchCompat

    android:layout_width="fill_parent"

    android:layout_height="match_parent"

    android:text="Switch"/>

答案 1 :(得分:0)

我遇到了同样的问题。我用this解决了 我认为如果

你需要更换你的“AvisosTipoB”

您需要获取菜单项,稍后使用MenuItemCompat设置动作(setActionView),传递menuItem和layout (R.layout.menu_notificaciones)。 声明布局并指定= (xxxxLayout) MenuItemCompat.getActionView(menuItem)