Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设置菜单项的自定义布局?_Java_Android_Android Menu - Fatal编程技术网

Java 如何设置菜单项的自定义布局?

Java 如何设置菜单项的自定义布局?,java,android,android-menu,Java,Android,Android Menu,在我的应用程序中,我想使用带有图标的弹出菜单,我写下下面的代码 但是我想将我的自定义布局设置为菜单项,但不显示任何项 我的意思是,而不是显示菜单标题和图标 我的Java代码: public void onMoreMenu(View view) { showPopupWindow(view); } void showPopupWindow(View view) { PopupMenu popup = new PopupMenu(AuctionDetailPage.this, vi

在我的应用程序中,我想使用带有图标的弹出菜单,我写下下面的代码
但是我想将我的自定义布局设置为
菜单
,但不显示任何项
我的意思是,而不是显示菜单标题和图标

我的Java代码:

public void onMoreMenu(View view) {
    showPopupWindow(view);
}

void showPopupWindow(View view) {
    PopupMenu popup = new PopupMenu(AuctionDetailPage.this, view);
    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.getMenuInflater().inflate(R.menu.detail_menu, popup.getMenu());
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

        public boolean onMenuItemClick(MenuItem item) {
            Toast.makeText(getApplicationContext(), "You Clicked : " + item.getTitle(),  Toast.LENGTH_SHORT).show();
            return true;
        }
    });
    popup.show();
}
public void onmore菜单(视图){
showPopupWindow(视图);
}
void showPopupWindow(视图){
PopupMenu popup=新建PopupMenu(AuctionDetailPage.this,视图);
试一试{
Field[]fields=popup.getClass().getDeclaredFields();
用于(字段:字段){
if(“mPopup.equals(field.getName())){
字段。setAccessible(true);
Object menuPopupHelper=field.get(弹出窗口);
Class CLASSPOPUSCURLPER=Class.forName(menuPopupHelper.getClass().getName());
方法setForceIcons=classpopunculper.getMethod(“setForceShowIcon”,boolean.class);
调用(menuPopupHelper,true);
打破
}
}
}捕获(例外e){
e、 printStackTrace();
}
popup.getMenuInflater().充气(R.menu.detail_菜单,popup.getMenu());
setOnMenuItemClickListener(新的PopupMenu.OnMenuItemClickListener(){
公共布尔onMenuItemClick(菜单项){
Toast.makeText(getApplicationContext(),“您单击的:”+item.getTitle(),Toast.LENGTH_SHORT.show();
返回true;
}
});
popup.show();
}
菜单代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <group android:checkableBehavior="none">

        <item
            android:id="@+id/nav_2"
            android:title=""
            app:actionLayout="@layout/item_test"
            app:showAsAction="always" />

    </group>

</menu>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp">

    <ImageView
        android:id="@+id/itemNav_img"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:tint="#876"
        android:layout_toRightOf="@+id/itemNav_txt"
        android:src="@drawable/about" />

    <TextView
        android:id="@+id/itemNav_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:textColor="#876"
        android:text="Test" />

</RelativeLayout>

自定义布局代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <group android:checkableBehavior="none">

        <item
            android:id="@+id/nav_2"
            android:title=""
            app:actionLayout="@layout/item_test"
            app:showAsAction="always" />

    </group>

</menu>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp">

    <ImageView
        android:id="@+id/itemNav_img"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:tint="#876"
        android:layout_toRightOf="@+id/itemNav_txt"
        android:src="@drawable/about" />

    <TextView
        android:id="@+id/itemNav_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:textColor="#876"
        android:text="Test" />

</RelativeLayout>

如何修复它并将自定义布局设置为菜单项

任何帮助都将不胜感激。谢谢。

无效显示弹出窗口(查看)
void showPopupWindow(View view)
    {
        PopupMenu popup = new PopupMenu(getBaseActivity(), view);
        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.getMenuInflater().inflate(R.menu.job_menu, popup.getMenu());

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
        {

            public boolean onMenuItemClick(MenuItem item)
            {
                int id = item.getItemId();

                if (id == R.id.postNewJob) {
                    Intent intent = new Intent(getBaseActivity(),CreateJobActivity.class);
                    getBaseActivity().startActivity(intent);
                    return true;
                }

                if (id == R.id.renewExpiredJob) {
                    Intent intent = new Intent(getBaseActivity(),RenewExpireJobListActivity.class);
                    getBaseActivity().startActivity(intent);
                    return true;
                }

                if (id == R.id.viewMyJobs)
                {
                    Intent intent = new Intent(getBaseActivity(), MyJobActivity.class);
                    getBaseActivity().startActivity(intent);
                    return true;
                }

                return false;

            }
        });
        popup.show();
    }
{ PopupMenu popup=新建PopupMenu(getBaseActivity(),视图); 试一试{ Field[]fields=popup.getClass().getDeclaredFields(); 用于(字段:字段){ if(“mPopup.equals(field.getName())) { 字段。setAccessible(true); Object menuPopupHelper=field.get(弹出窗口); Class CLASSPOPUSCURLPER=Class.forName(menuPopupHelper.getClass().getName()); 方法setForceIcons=classpopunculper.getMethod(“setForceShowIcon”,boolean.class); 调用(menuPopupHelper,true); 打破 } } }捕获(例外e){ e、 printStackTrace(); } popup.getMenuInflater().充气(R.menu.job_菜单,popup.getMenu()); setOnMenuItemClickListener(新的PopupMenu.OnMenuItemClickListener() { 公共布尔onMenuItemClick(菜单项) { int id=item.getItemId(); if(id==R.id.postNewJob){ Intent Intent=new Intent(getBaseActivity(),CreateJobActivity.class); getBaseActivity().startActivity(意图); 返回true; } if(id==R.id.RenewaredExpiredJob){ Intent Intent=new Intent(getBaseActivity(),RenewExpireJobListActivity.class); getBaseActivity().startActivity(意图); 返回true; } if(id==R.id.viewMyJobs) { Intent Intent=new Intent(getBaseActivity(),MyJobActivity.class); getBaseActivity().startActivity(意图); 返回true; } 返回false; } }); popup.show(); }
作业菜单:

<menu
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/postNewJob"
        android:title="Post New Job"
        android:icon="@drawable/icon_add_black"/>

    <item
        android:id="@+id/renewExpiredJob"
        android:title="Renew Expired Job"
        android:icon="@drawable/icon_expired_job"/>

    <item
        android:id="@+id/viewMyJobs"
        android:title="View my Job Posts"
        android:icon="@drawable/icon_jobs_tab_black"/>

</menu>

试试这些教程可能会解决您的问题


好的,因此可以使用ListPopupWindow(根据文档)从以下步骤执行此操作:

步骤1:创建一个模型类

public class Item {
    private String title;
    private int imageRes;

    public Item(String title, int imageRes) {
        this.title = title;
        this.imageRes = imageRes;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getImageRes() {
        return imageRes;
    }

    public void setImageRes(int imageRes) {
        this.imageRes = imageRes;
    }
}
步骤2:创建适配器

public class ListPopupWindowAdapter extends BaseAdapter {
    LayoutInflater mLayoutInflater;
    List<Item> mItemList;

    public ListPopupWindowAdapter(Context context, List<Item> itemList) {
        mLayoutInflater = LayoutInflater.from(context);
        mItemList = itemList;
    }

    @Override
    public int getCount() {
        return mItemList.size();
    }

    @Override
    public Item getItem(int i) {
        return mItemList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.detail_menu, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.tvTitle.setText(getItem(position).getTitle());
        holder.ivImage.setImageResource(getItem(position).getImageRes());

        return convertView;
    }

    static class ViewHolder {
        TextView tvTitle;
        ImageView ivImage;

        ViewHolder(View view) {
            tvTitle = view.findViewById(R.id.text);
            ivImage = view.findViewById(R.id.image);
        }
    }
}

就这样,试试看,让我知道。

你想把它作为弹出菜单还是只想在默认菜单上设置自定义布局?@UmangBurman,我想将自定义布局设置为“菜单”,并将其用于弹出菜单。你能帮我吗?是的,我也做过类似的事情,所以。。只要一分钟…@UmangBurman,谢谢我的兄弟。我会等你,请帮帮我。我真的需要你的帮助。谢谢,你犯了什么错误?嘿,亲爱的,你看过我的短信了吗?我想将自定义布局设置为菜单。我可以用弹出菜单来帮助我亲爱的兄弟。我使用您的代码,并向我显示自定义布局的弹出菜单。但显示的项目非常小,不显示标题和图片全文。为什么?我认为问题在于
查看锚定
。此菜单宽度为菜单图像宽度!你能帮我一下吗,我的兄弟?你需要在popupwindow对象中定义宽度:popupwindow.width=ListPopupWindow.MATCH\u父对象或固定宽度。