PopupMenu图标不显示

nat*_*iyu 2 android listview popupmenu

我创建了ListView一个PopupMenu在每个项目中都有一个.我创建了一个menu layout并将其用作我的PopupMenu.我的问题是每次我点击我的项目的椭圆选项时ListViewPopupMenu显示有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>
Run Code Online (Sandbox Code Playgroud)

然后在我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;
    }
}
Run Code Online (Sandbox Code Playgroud)

提前感谢您的帮助.

Jar*_*ler 10

MenuBuilder是一个隐藏的类,但确实包含一个显示图标的方法。您将需要使用反射来显示菜单中的图标。尝试将其添加到showPopop(View, int)

PopupMenu popup = new PopupMenu(mContext, v);
try {
  Method method = popup.getMenu().getClass().getDeclaredMethod("setOptionalIconsVisible", boolean.class);
  method.setAccessible(true);
  method.invoke(popup.getMenu(), true);
} catch (Exception e) {
  e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)


nat*_*iyu 8

我在此链接中找到了一个解决方案并将其应用于我的代码.

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();
    }
Run Code Online (Sandbox Code Playgroud)

  • 这种方式可以工作,但是,如果您在项目中使用 proguard/dexguard,由于使用了反射,这可能不适用于发行版 APK。 (2认同)