Java PopupWindow如何以编程方式更改图标和背景?

Java PopupWindow如何以编程方式更改图标和背景?,java,android,Java,Android,具有PopupWindow的xml文件: 如何以编程方式替换此xml中的图标和背景? 您可以使用 LinearLayout ll=(LinearLayout)findViewById(R.id.linear); ll.挫折背景(…) 您可以使用 LinearLayout ll=(LinearLayout)findViewById(R.id.linear); ll.挫折背景(…)首先初始化要更改的imageView。像这样: ImageView imageView = (ImageView) f

具有PopupWindow的xml文件:

如何以编程方式替换此xml中的图标和背景?

您可以使用
LinearLayout ll=(LinearLayout)findViewById(R.id.linear);
ll.挫折背景(…)
您可以使用
LinearLayout ll=(LinearLayout)findViewById(R.id.linear);

ll.挫折背景(…)首先初始化要更改的imageView。像这样:

ImageView imageView = (ImageView) findViewById(R.id.yourImageViewId);
然后


同样,您也可以对背景进行更改。

首先初始化要更改的imageView。像这样:

ImageView imageView = (ImageView) findViewById(R.id.yourImageViewId);
然后


同样,您也可以对背景进行更改。

您需要应用主题样式,如下所示:

<style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
        <item name="android:popupBackground">@color/colorPrimary</item>
        <item name="android:background">@color/colorPrimary</item>
        <item name="android:textColorPrimary">@android:color/darker_gray</item>
    </style>

@颜色/原色
@颜色/原色
@android:颜色/深灰色
以下代码适用于我:

public void showPopUpMenu(final Context context, View view) {
            Context wrapper = new ContextThemeWrapper(context, R.style.PopupMenu);
            PopupMenu popup = new PopupMenu(wrapper, view, Gravity.END);
            MenuInflater inflater = popup.getMenuInflater();
            inflater.inflate(R.menu.menu_options, popup.getMenu());
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    switch (menuItem.getItemId()) {
                        case R.id.action_share:
                            shareWithFriends();
                            break;
                        default:
                            break;
                    }
                    return true;
                }
            });

            try {
                Field[] fields = popup.getClass().getDeclaredFields();
                for (Field field : fields) {
                    if ("mPopup".equals(field.getName())) {
                        field.setAccessible(true);
                        Object menuPopupHelper = field.get(popup);
                        Class<?> classPopupHelper = Class.forName(menuPopupHelper
                                .getClass().getName());
                        Method setForceIcons = classPopupHelper.getMethod(
                                "setForceShowIcon", boolean.class);
                        setForceIcons.invoke(menuPopupHelper, true);
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            popup.show();
        }
public void showPopUpMenu(最终上下文,视图){
上下文包装器=新的上下文主题包装器(Context,R.style.PopupMenu);
PopupMenu popup=新的PopupMenu(包装器、视图、重力.END);
MenuInflater充气器=弹出窗口。getMenuInflater();
充气器。充气(R.menu.menu_选项,popup.getMenu());
setOnMenuItemClickListener(新的PopupMenu.OnMenuItemClickListener(){
@凌驾
公共布尔onMenuItemClick(MenuItem MenuItem){
开关(menuItem.getItemId()){
案例R.id.行动与共享:
与朋友分享();
打破
违约:
打破
}
返回true;
}
});
试一试{
Field[]fields=popup.getClass().getDeclaredFields();
用于(字段:字段){
if(“mPopup.equals(field.getName())){
字段。setAccessible(true);
Object menuPopupHelper=field.get(弹出窗口);
Class CLASSPOPUSCURLPER=Class.forName(menuPopupHelper
.getClass().getName());
方法setForceIcons=classPopucUpCelper.getMethod(
“setForceShowIcon”,boolean.class);
调用(menuPopupHelper,true);
打破
}
}
}捕获(例外e){
e、 printStackTrace();
}
popup.show();
}

您需要应用以下主题样式:

<style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
        <item name="android:popupBackground">@color/colorPrimary</item>
        <item name="android:background">@color/colorPrimary</item>
        <item name="android:textColorPrimary">@android:color/darker_gray</item>
    </style>

@颜色/原色
@颜色/原色
@android:颜色/深灰色
以下代码适用于我:

public void showPopUpMenu(final Context context, View view) {
            Context wrapper = new ContextThemeWrapper(context, R.style.PopupMenu);
            PopupMenu popup = new PopupMenu(wrapper, view, Gravity.END);
            MenuInflater inflater = popup.getMenuInflater();
            inflater.inflate(R.menu.menu_options, popup.getMenu());
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    switch (menuItem.getItemId()) {
                        case R.id.action_share:
                            shareWithFriends();
                            break;
                        default:
                            break;
                    }
                    return true;
                }
            });

            try {
                Field[] fields = popup.getClass().getDeclaredFields();
                for (Field field : fields) {
                    if ("mPopup".equals(field.getName())) {
                        field.setAccessible(true);
                        Object menuPopupHelper = field.get(popup);
                        Class<?> classPopupHelper = Class.forName(menuPopupHelper
                                .getClass().getName());
                        Method setForceIcons = classPopupHelper.getMethod(
                                "setForceShowIcon", boolean.class);
                        setForceIcons.invoke(menuPopupHelper, true);
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            popup.show();
        }
public void showPopUpMenu(最终上下文,视图){
上下文包装器=新的上下文主题包装器(Context,R.style.PopupMenu);
PopupMenu popup=新的PopupMenu(包装器、视图、重力.END);
MenuInflater充气器=弹出窗口。getMenuInflater();
充气器。充气(R.menu.menu_选项,popup.getMenu());
setOnMenuItemClickListener(新的PopupMenu.OnMenuItemClickListener(){
@凌驾
公共布尔onMenuItemClick(MenuItem MenuItem){
开关(menuItem.getItemId()){
案例R.id.行动与共享:
与朋友分享();
打破
违约:
打破
}
返回true;
}
});
试一试{
Field[]fields=popup.getClass().getDeclaredFields();
用于(字段:字段){
if(“mPopup.equals(field.getName())){
字段。setAccessible(true);
Object menuPopupHelper=field.get(弹出窗口);
Class CLASSPOPUSCURLPER=Class.forName(menuPopupHelper
.getClass().getName());
方法setForceIcons=classPopucUpCelper.getMethod(
“setForceShowIcon”,boolean.class);
调用(menuPopupHelper,true);
打破
}
}
}捕获(例外e){
e、 printStackTrace();
}
popup.show();
}

弹出菜单的XML布局通常在菜单文件夹中创建

您必须在调用popup.show()之前更改它


弹出菜单的XML布局通常在菜单文件夹中创建

您必须在调用popup.show()之前更改它

LinearLayout menuLayout=(LinearLayout)activity.getLayoutInflater().inflate(menuId,null);
int layoutCount=menuLayout.getChildCount();
对于(int i=0;i
您可以使用findViewById查找项目。

LinearLayout menuLayout=(LinearLayout)活动。GetLayoutFlater()。充气(menuId,null);
int layoutCount=menuLayout.getChildCount();
对于(int i=0;i