2016-06-27 3 views
7

Вот как я создаю PopupWindow:PopupWindow фон иногда становится прозрачными и фиолетовый

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 является сплошным цветом, белым или черным, в зависимости от темы. Иногда случается следующее:

enter image description here

Как я могу избежать этого? Это происходит в эмулятор с андроид 6 ИНОГДА только для примера ... Обычно PopupWindow фон работает, как ожидалось, хотя ...

Редактировать

Кроме того, вот мой getThemeReference метод:

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 - это может решить проблему: с помощью getThemeColor вместо getThemeReference

public static int getThemeColor(Context context, int attribute) 
{ 
    TypedValue typeValue = new TypedValue(); 
    context.getTheme().resolveAttribute(attribute, typeValue, true); 
    if (typeValue.type >= TypedValue.TYPE_FIRST_COLOR_INT && typeValue.type <= TypedValue.TYPE_LAST_COLOR_INT) 
    { 
     int color = typeValue.data; 
     return color; 
    } 
    else 
    { 
     return -1; 
    } 
} 
+0

Пожалуйста, напишите свой метод 'getThemeReference'. –

+0

Готово. Тем не менее, я не верю, что причина этой проблемы кроется там, поскольку это будет означать, что эта проблема происходит всегда, но это происходит редко (и до сих пор я видел ее только на android 6) – prom85

ответ

5

Благодарим за обновление. Я попросил вас показать метод, потому что я действительно использую то же самое в своих приложениях для извлечения атрибутов цвета, но наши методы немного разные.

Вот мое:

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

Несмотря на то, что я не могу быть уверен, что это действительно проблема, есть что-то не так с вашими комментариями. Вызов new ColorDrawable() ожидает цвета, а не ссылки. Я иногда также делал эту ошибку в прошлом, а также получал странные цвета, потому что система пыталась создать цвет с идентификатором ссылки. Вы пробовали настоящий цвет как красный, чтобы увидеть, действительно ли ваш метод работает?

Я бы заменил ваш метод моим, потому что он гарантирует вам получение цвета.

+0

Итак, вы думаете (Я могу сделать это неправильно, это правда), что одно и то же устройство и система создают разные цвета с помощью моего метода? Это происходит при запуске моего приложения. Вы открываете всплывающее окно, это нормально, вы вращаете устройство, снова открываете его, он фиолетовый (он непредсказуемо меняет цвета, в большинстве случаев цвет правильный) – prom85

+0

Btw, мой 'R.attr.main_background_color' является ссылкой ... Это не цвет ... У меня есть второй метод с тем же именем, что и у вас ;-). Он также должен работать, я просто разместил его в своем вопросе ... На самом деле это может быть потому, что я передаю ссылку на цвет вместо полностью разрешенного цвета ... – prom85

+0

@ prom85 Как я уже сказал, не уверен, что это будет в любом случае, но стоит попробовать. В остальной части кода, который вы указали, я не вижу ничего, что могло бы быть связано с этой проблемой. –