我创建的ListView
在每个项目中都有PopupMenu
。我创建了menu layout
并将其用作我的PopupMenu
。我的问题是,每当我点击ListView
项目中的省略号选项时,PopupMenu
都会显示Text
,但Icon
未显示。
这是我的xml菜单:
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_retry"
android:icon="@drawable/retry"
android:title="@string/retry"
app:showAsAction="always"
/>
<item
android:id="@+id/action_delete"
android:icon="@drawable/delete"
android:title="@string/delete"
app:showAsAction="always"
/>
</menu>
然后在我的Adapter
ListView
中就像这样:
public class MyListViewAdapter extends BaseAdapter implements MenuItem.OnMenuItemClickListener {
.....
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = activity.getLayoutInflater();
convertView = inflater.inflate(R.layout.mylistrow, null);
}
final View action = (View) convertView.findViewById(R.id.action);
action.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
showPopup(action, position);
}
});
// ....codes for listview creation....
return convertView;
}
public void showPopup(View v, int listItemPosition) {
PopupMenu popup = new PopupMenu(mContext, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.outbox_menu, popup.getMenu());
popup.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_retry:
return true;
case R.id.action_delete:
return true;
default:
return false;
}
}
提前感谢您的帮助。
答案 0 :(得分:7)
我在此link中找到了一个解决方案并将其应用于我的代码。
PopupMenu popup = new PopupMenu(mContext, view);
try {
Field[] fields = popup.getClass().getDeclaredFields();
for (Field field : fields) {
if ("mPopup".equals(field.getName())) {
field.setAccessible(true);
Object menuPopupHelper = field.get(popup);
Class<?> classPopupHelper = Class.forName(menuPopupHelper.getClass().getName());
Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class);
setForceIcons.invoke(menuPopupHelper, true);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
答案 1 :(得分:3)
int size = 0;
Node head;
boolean isEmpty1() {
return head == null;
}
boolean isEmpty2() {
return size == 0;
}
是一个隐藏的类,但确实包含一个显示图标的方法。您需要使用反射来显示菜单中的图标。请尝试在MenuBuilder
:
showPopop(View, int)
答案 2 :(得分:0)
在科特林
val popup = PopupMenu(context, holder.img_menu)
try {
popup.inflate(R.menu.bank_edit_menu)
val fields: Array<Field> = popup.javaClass.declaredFields
for (field in fields) {
if ("mPopup" == field.getName()) {
field.setAccessible(true)
val menuPopupHelper: Any = field.get(popup)
val classPopupHelper =
Class.forName(menuPopupHelper.javaClass.name)
val setForceIcons: Method = classPopupHelper.getMethod(
"setForceShowIcon",
Boolean::class.javaPrimitiveType
)
setForceIcons.invoke(menuPopupHelper, true)
break
}
}
popup.setOnMenuItemClickListener(object : PopupMenu.OnMenuItemClickListener{
override fun onMenuItemClick(p0: MenuItem?): Boolean {
Log.e(">>",p0.toString())
return true
}
})
popup.show();
} catch (e: Exception) {
e.printStackTrace()
}