java - 为什么 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;
}
}
提前致谢。
解决方案
与回收站视图等其他小部件相比,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;
}
}
希望这有帮助
推荐阅读
- ios - 如何在没有 Apple Developer Account 的情况下在 iPhone 上部署 Flutter 应用程序?
- angular - RxJs 每 x 秒处理一次第一个事件
- docker - Docker 构建:无法为 openjdk 获取 oauth 令牌?
- python - Python范围打印两次
- google-sheets - 谷歌表格出勤跟踪公式
- r - 有没有办法显示合并的进度
- ruby-on-rails - 如何使用 collection_select 来调整我的表单?
- javascript - TypeError:无法读取未定义的属性“incrementMaxListeners”
- php - 数据库结果按最接近的匹配排序(3 个数字标准)
- python - Jupyter Notebook Kernel Not Connecting: Connection Failed(而 Jupyter 内核连接在 Visual Studio Code 中工作)