【问题标题】:How to add custom MenuItem dynamically in NavigationView?如何在 NavigationView 中动态添加自定义 MenuItem?
【发布时间】:2016-03-16 03:22:56
【问题描述】:

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

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>

但它不起作用。

【问题讨论】:

    标签: java android navigationview


    【解决方案1】:

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

    使用 compile '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"/>
    

    【讨论】:

      【解决方案2】:

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

      ,我认为您需要更换“AvisosTipoB”

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

      【讨论】:

        猜你喜欢
        • 2013-01-07
        • 2015-08-17
        • 2015-09-06
        • 1970-01-01
        • 2018-10-19
        • 2016-08-04
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        相关资源
        最近更新 更多