Java 使用proguard时未在屏幕上显示自定义弹出菜单图标
我已经为我的一个android应用程序实现了带有图标的自定义弹出菜单。这里我设置的图标也应用了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
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设置有关。但不确定我应该指定保留哪个类。这里找不到合法的解决方案