首页 > 解决方案 > 为什么 item.getMenuInfo() 返回 null?

问题描述

我一直在尝试制作一个带有菜单的简单应用程序,该菜单可以更改调用菜单的项目的背景颜色。但相反 item.getMenuInfo 返回 null 我不知道为什么。

互联网上的一些解决方案说这是因为您应该传递整个列表而不是项目。但是我传递了整个 ListView 但我不断收到 java.lang.NullPointerException 因为 item.getMenuItem() 返回 null。

这是我注册它的地方:

AdaptadorPersonalizado adaptador = new AdaptadorPersonalizado(this, R.layout.layoutlinealistview, elementos);

ListView lista = (ListView) findViewById(R.id.provincias);

lista.setAdapter(adaptador);
lista.setOnItemClickListener(this);

registerForContextMenu(lista);

在这个方法中我使用了 item.getMenuInfo() 函数:

public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

        switch(item.getItemId()) {
            case R.id.rojo:
                return true;

            default:
                return true;
        }
    }

这是我创建自定义 ArrayAdapter 并为其分配内容的类:

String[] elementos = {"León",
                "Zamora",
                "Salamanca",
                "Palencia",
                "Valladolid",
                "Ávila",
                "Burgos",
                "Segovia",
                "Soria"};

        String[] descripciones = {"Provincia de Leon",
                "Provincia de Zamora",
                "Provincia de Salamanca",
                "Provincia de Palencia",
                "Provincia de Valladolid",
                "Provincia de Ávila",
                "Provincia de Burgos",
                "Provincia de Segovia",
                "Provincia de Soria"
        };

        int[] imagenes = {R.drawable.leon,
                R.drawable.zamora,
                R.drawable.salamanca,
                R.drawable.palencia,
                R.drawable.valladolid,
                R.drawable.avila,
                R.drawable.burgos,
                R.drawable.segovia,
                R.drawable.soria
        };

        class AdaptadorPersonalizado extends ArrayAdapter<String> {
            public AdaptadorPersonalizado(Context ctx, int txtViewResourceId, String[] objects) {
                super(ctx, txtViewResourceId, objects);
            }

            @Override
            public View getDropDownView(int position, View cnvtView, ViewGroup prnt) {
                return crearFilePersonalizada(position, cnvtView, prnt);
            }

            public View getView(int pos, View cnvtView, ViewGroup prnt) {
                return crearFilePersonalizada(pos, cnvtView, prnt);
            }

            private View crearFilePersonalizada(int posicion, View convertView, ViewGroup parent) {
                LayoutInflater inflador = getLayoutInflater();
                View miFila = inflador.inflate(R.layout.layoutlinealistview, parent, false);

                TextView nombre = miFila.findViewById(R.id.textViewNombre);
                nombre.setText(elementos[posicion]);

                TextView descripcion = miFila.findViewById(R.id.textViewDescripcion);
                descripcion.setText(descripciones[posicion]);

                ImageView imagen = miFila.findViewById(R.id.imageViewImagenesCiudades);
                imagen.setImageResource(imagenes[posicion]);

                return miFila;
            }
        }

提前致谢。

标签: javaandroidnullpointerexceptionnullreturn

解决方案


与回收站视图等其他小部件相比,Android 菜单非常易于使用。 不需要为菜单使用适配器,因为它是默认处理的。您需要做的就是,在res/layout中创建一个名为 menu 的 XML 文件

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Single menu item 
     Set id, icon and Title for each menu item -->
     <item android:id="@+id/menu_leon"
      android:icon="@drawable/icon_leon"
      android:title="Leon" />

     <item android:id="@+id/menu_zamora"
      android:icon="@drawable/icon_zamora"
      android:title="zamora" />
  </menu>

对于您的所有菜单项,然后在您的片段/活动中使用

 // Initiating Menu XML file (menu.xml)
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.layout.menu, menu);
        return true;
    }
     

然后做,

     @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
             
            switch (item.getItemId())
            {
            case R.id.leon:
                //Do your stuff for leon, zomara,etc
                return true;
     }
}

希望这有帮助


推荐阅读