繁体   English   中英

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

[英]How to add custom MenuItem dynamically in 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);
                }
            }
        }
    }

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

根据这篇文章是可能的:

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>

但这是行不通的。

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

使用编译'com.android.support:appcompat-v7:23.1.1'

菜单项

<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"/>

我有同样的问题。 我解决了这个问题,我认为您需要在以下情况下替换“ AvisosTipoB”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM