2016-06-22 14 views
0

Ich habe ein benutzerdefiniertes Popup-Menü mit einem Symbol für eine meiner Android-Apps implementiert. Hier setze ich das Icon auch angewendet setForceShowIcon. Hier ist der folgende CodeBenutzerdefiniertes PopUp-Menüsymbol wird bei der Verwendung von Proguard nicht angezeigt

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(); 

Das Symbol angezeigt wird, wenn ich die App in Debug-Modus läuft aber in Release-Modus mit Proguard das Symbol nicht angezeigt wird. Hier ist meine proguard Konfiguration für setForceShowIcon

###################################### 
####### 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); } 

Bitte lassen Sie mich wissen, wo &, was ich falsch mache. TIA

+0

Haben Sie dieses Problem lösen? Ich vermute zu stark, wie in der Antwort unten erklärt, dies bezieht sich auf Progard Einstellung. Aber nicht sicher, welche Klasse genau ich angeben soll. – Atul

+0

Das gleiche hier konnte keine legitime Lösung finden – silverFoxA

Antwort

0

Da Sie Reflexion in Ihrer benutzerdefinierten Popup-Klasse verwenden, müssen Sie es von prouard vermeiden.

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

-keepclassmembers class * extends com.yoursite.android.yourappname.YourClassName{ 
public <init>(android.content.Context); 
} 
+0

Ich benutze den obigen Code in einem Adapter, daher bin ich nicht wirklich jede Klasse erweitern. Können Sie bitte erklären Sie Ihre Lösung über – silverFoxA

+0

Ich meine, Sie müssen eine benutzerdefinierte Klasse erweitern PopupMenu und vermeiden Sie die Verwendung des obigen Codes. – Sudhi

+0

Aber meine Proguard Einstellungen macht das gleiche. Nicht wahr ?! – silverFoxA

0

Seit setForceShowIcon ist Mitglied android.support.v7.view.menu.MenuPopupHelper I, in der Regel hinzugefügt, diese Zeilen zu meinen proguard-Regeln und es funktionierte sehr gut:

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

Salam. Diese Zeile in proguard-rules.pro mein Problem lösen:

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