PopupWindow 背景有时会变得透明和紫色
PopupWindow background sometimes gets transparent and purple
以下是我创建 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
是纯色,白色或黑色,视主题而定。有时会发生以下情况:
我怎样才能避免这种情况?它发生在模拟器中 android 6 SOMETIMES 仅例如...通常,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;
}
}
编辑 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;
}
}
感谢您的更新,我要求您展示方法,因为我实际上在我的应用程序中使用相同的东西来检索颜色属性,但我们的方法有点不同。
这是我的:
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()
需要颜色,而不是参考。我过去有时也会犯这个错误,也会得到奇怪的颜色,因为系统试图生成带有参考 ID 的颜色。您是否尝试过像红色这样的真实颜色,看看您的方法是否真的有效?
无论如何我都会用我的方法替换你的方法,因为它保证你检索到颜色。
以下是我创建 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
是纯色,白色或黑色,视主题而定。有时会发生以下情况:
我怎样才能避免这种情况?它发生在模拟器中 android 6 SOMETIMES 仅例如...通常,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;
}
}
编辑 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;
}
}
感谢您的更新,我要求您展示方法,因为我实际上在我的应用程序中使用相同的东西来检索颜色属性,但我们的方法有点不同。
这是我的:
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()
需要颜色,而不是参考。我过去有时也会犯这个错误,也会得到奇怪的颜色,因为系统试图生成带有参考 ID 的颜色。您是否尝试过像红色这样的真实颜色,看看您的方法是否真的有效?
无论如何我都会用我的方法替换你的方法,因为它保证你检索到颜色。