Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用proguard时未在屏幕上显示自定义弹出菜单图标_Java_Android_Popup_Proguard - Fatal编程技术网

Java 使用proguard时未在屏幕上显示自定义弹出菜单图标

Java 使用proguard时未在屏幕上显示自定义弹出菜单图标,java,android,popup,proguard,Java,Android,Popup,Proguard,我已经为我的一个android应用程序实现了带有图标的自定义弹出菜单。这里我设置的图标也应用了setforceshowcon。以下是代码 final PopupMenu popupMenu = new PopupMenu(mContext, shareFeed); popupMenu.inflate(R.menu.custom_share_menu); Object menuHelper; Class[] argTypes

我已经为我的一个android应用程序实现了带有图标的自定义弹出菜单。这里我设置的图标也应用了
setforceshowcon
。以下是代码

 final PopupMenu popupMenu = new PopupMenu(mContext, shareFeed);
            popupMenu.inflate(R.menu.custom_share_menu);
            Object menuHelper;
            Class[] argTypes;
            Field fMenuHelper = null;
            try {
                fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
                fMenuHelper.setAccessible(true);
                menuHelper = fMenuHelper.get(popupMenu);
                argTypes = new Class[]{boolean.class};
                menuHelper.getClass().getDeclaredMethod("setForceShowIcon", argTypes).invoke(menuHelper, true);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            final String des = map.get("title") + "\n" + map.get("description");
            final String message = Html.fromHtml(des).toString() + "\n" + mContext.getResources().getString(R.string.app_url);
            popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    switch (menuItem.getItemId()) {
                        case R.id.whatsapp:
                            if (PerformCommonOps.internetConnection(mContext))
                                PerformCommonOps.shareFeedsOnWhatsapp(mContext, message);
                            else
                                Snackbar.make(coordinatorLayout, "Please ensure you have a working internet connection", Snackbar.LENGTH_SHORT).show();
                            return true;
                        case R.id.facebook:
                            if (PerformCommonOps.internetConnection(mContext))
                                PerformCommonOps.shareToFacebbok(mContext, mContext.getResources().getString(R.string.app_url), view, (Activity) mContext);
                            else
                                Snackbar.make(coordinatorLayout, "Please ensure you have a working internet connection", Snackbar.LENGTH_SHORT).show();
                            return true;
                        case R.id.text:
                            if (PerformCommonOps.internetConnection(mContext))
                                PerformCommonOps.sendText(mContext, message);
                            else
                                Snackbar.make(coordinatorLayout, "Please ensure you have a working internet connection", Snackbar.LENGTH_SHORT).show();
                            return true;
                        case R.id.googleplus:
                            if (PerformCommonOps.internetConnection(mContext))
                                PerformCommonOps.shareOnGooglePlus(mContext, Html.fromHtml(des).toString(), mContext.getResources().getString(R.string.app_url), view);
                            else
                                Snackbar.make(coordinatorLayout, "Please ensure you have a working internet connection", Snackbar.LENGTH_SHORT).show();
                            return true;
                        default:
                            common();
                            return true;
                    }

                }
            });
            popupMenu.show();
当我在调试模式下运行应用程序时,会显示图标,但在发布模式下使用Proguard时,不会显示图标。 这是我对
setforceshowcon

######################################
####### POPUpMenu configurations######
######################################
 -keepclassmembernames class android.support.v7.widget.PopupMenu { private android.support.v7.internal.view.menu.MenuPopupHelper mPopup; }
 -keepclassmembernames class android.support.v7.internal.view.menu.MenuPopupHelper { public void setForceShowIcon(boolean); }

请让我知道我做错了什么TIA

因为您在自定义弹出类中使用反射,所以需要避免proguard使用反射

-keep public class * extends com.yoursite.android.yourappname.YourClassName

-keepclassmembers class * extends com.yoursite.android.yourappname.YourClassName{
 public <init>(android.content.Context);
}
-keep public class*扩展com.yoursite.android.yourappname.YourClassName
-keepclassmembers类*扩展com.yoursite.android.yourappname.YourClassName{
public(android.content.Context);
}

由于
setForceShowIcon
android.support.v7.view.menu.OpupPhelper
的成员,我通常在我的proguard规则中添加了以下几行,效果非常好:

-keep class * extends android.support.v7.** { *; }
-keepclassmembernames class * extends android.support.v7.** { *; }

proguard rules.pro中的这一行解决了我的问题:


-keep class android.support.v7.widget.*{*}

我在适配器中使用上述代码,因此我没有真正扩展任何类。你能解释一下你的解决方案吗?我的意思是你需要做一个自定义的类扩展弹出菜单,避免使用上面的代码。但是我的proguard设置也是这样做的。他们不是吗?!是的,但如果您使用适配器内的弹出菜单,那么它将被正确地显示。因此反射代码也会受到影响。因此,创建自己的自定义类扩展PopupMenu,并将反射代码放入其中。然后试试上面的一个。但是根据我的pro guard设置,它保留了所有使用私有类的文件。你解决了这个问题吗?我强烈怀疑下面的回答中解释的这与proguard设置有关。但不确定我应该指定保留哪个类。这里找不到合法的解决方案