2016-06-27 15 views
7

Hier ist, wie ich ein PopupWindow:PopupWindow Hintergrund wird manchmal transparent und lila

private static PopupWindow createPopup(FragmentActivity activity, View view) 
{ 
    PopupWindow popup = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); 
    popup.setOutsideTouchable(true); 
    popup.setFocusable(true); 
    popup.setBackgroundDrawable(new ColorDrawable(Tools.getThemeReference(activity, R.attr.main_background_color))); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
     popup.setElevation(Tools.convertDpToPixel(8, activity)); 
    PopupWindowCompat.setOverlapAnchor(popup, true); 

    return popup; 
} 

main_background_color ist eine Farbe, weiß oder schwarz, je nach Thema. Manchmal passiert folgendes:

enter image description here

Wie kann ich das vermeiden? Es geschieht im Emulator mit Android 6 MANCHMAL nur zum Beispiel ... Normalerweise wird der PopupWindow Hintergrund arbeitet, als ob zu erwarten ...

bearbeiten

Zusätzlich ist hier meine getThemeReference Methode:

public static int getThemeReference(Context context, int attribute) 
{ 
    TypedValue typeValue = new TypedValue(); 
    context.getTheme().resolveAttribute(attribute, typeValue, false); 
    if (typeValue.type == TypedValue.TYPE_REFERENCE) 
    { 
     int ref = typeValue.data; 
     return ref; 
    } 
    else 
    { 
     return -1; 
    } 
} 

EDIT 2 - das Problem lösen kann: getThemeColor statt getThemeReference

mit
+0

Bitte posten Sie Ihre 'getThemeReference' Methode. –

+0

Fertig. Dennoch glaube ich nicht, dass der Grund für das Problem darin liegt, da dies bedeuten würde, dass dieses Problem immer auftritt, aber es passiert nur selten (und bis jetzt sah ich es nur auf Android 6) – prom85

Antwort

5

Danke für das Update, ich habe Sie gebeten, die Methode zu zeigen, weil ich tatsächlich die gleiche Art von Sache in meinen Apps verwenden, um Farbattribute abzurufen, aber unsere Methoden sind ein bisschen anders.

Hier Mine ist:

public static int getThemeColor(Context context, int attributeId) { 
    TypedValue typedValue = new TypedValue(); 

    TypedArray a = context.obtainStyledAttributes(typedValue.data, new int[] { attributeId }); 
    int color = a.getColor(0, 0); 

    a.recycle(); 

    return color; 
} 

Auch wenn ich nicht sicher sein kann, es ist in der Tat das Problem, es ist etwas falsch mit Ihren Kommentaren. Der Anruf new ColorDrawable() erwartet eine Farbe, keine Referenz. Manchmal habe ich diesen Fehler auch in der Vergangenheit gemacht und auch seltsame Farben bekommen, weil das System versucht hat, eine Farbe mit einer Referenz-ID zu erzeugen. Haben Sie eine echte Farbe wie Rot versucht, um zu sehen, ob Ihre Methode wirklich funktioniert?

Ich würde sowieso Ihre Methode mit mir ersetzen, weil es Ihnen garantiert, eine Farbe abzurufen.

+0

Also denkst du (Ich kann es falsch machen, das ist wahr), dass das gleiche Gerät und System, verschiedene Farben mit meiner Methode erzeugt? Dies passiert beim Ausführen meiner App. Sie öffnen das Popup, es ist in Ordnung, Sie drehen das Gerät, öffnen Sie die Popup, es ist violett (es ändert Farben unvorhersehbar, die meiste Zeit ist die Farbe korrekt) – prom85

+0

Btw, meine 'R.attr.main_background_color' ist eine Referenz ... Es ist keine Farbe ... Ich habe eine zweite Methode, mit dem gleichen Namen wie du ;-). Es sollte auch funktionieren, ich habe es gerade auch in meiner Frage gepostet ... Es könnte wirklich sein, weil ich eine Farbreferenz statt einer total aufgelösten Farbe überlasse ... – prom85

+0

@ prom85 Wie gesagt, nicht sicher, ob es so wäre machen Sie einen Unterschied, aber es ist den Versuch wert. Im Rest des von Ihnen bereitgestellten Codes sehe ich nichts anderes, was mit diesem Problem zusammenhängen könnte. –