【问题标题】:Popup Menu issue in Android ListViewAndroid ListView 中的弹出菜单问题
【发布时间】:2016-02-16 05:51:01
【问题描述】:

我是 Android 新手,我正在创建 Listview 弹出菜单。但我遇到了widthheight 的问题。弹出菜单可以采用更多的高度和宽度。 SO中有很多问题,但没有一个对我有帮助。

创建弹出菜单我尝试了以下方法

1 ] 使用弹出菜单,代码如下:

 private void showPopupMenu(View view){
        Context wrapper = new ContextThemeWrapper(this, R.style.PopupMenu);
        PopupMenu popupMenu = new PopupMenu(wrapper,view);

        popupMenu.getMenuInflater().inflate(R.menu.popup_menu,popupMenu.getMenu());
        popupMenu.show();

        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
            @Override
        public boolean onMenuItemClick(MenuItem item){
                switch (item.getItemId()){
                    case R.id.install:
                        Intent intent = new Intent(ViewAllRelationActivity.this,EditRelativeActivity.class);
                        startActivity(intent);
                        break;
                    case R.id.addtowishlist:
                        break;

                }
                return false;
            }
        });
    }

它给出了这个输出

2 ] 使用 ContextMenu 会显示以下输出

我们可以在 ContextMenu 中保持 宽度和高度,但它总是显示在中心 not each row of our Listview Data

但我想要below Image type Popup menu宽度和高度都很小

请提供解决方案。

【问题讨论】:

标签: android listview android-menu popupmenu


【解决方案1】:

如果你使用适配器,你可以在适配器中放入 getView(...) 方法

    imvMore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showPopupMenu(act,v);
        }
    });

和放置方法

private void showPopupMenu(Activity act, View view){
    PopupMenu popupMenu = new PopupMenu(act,view);
    popupMenu.getMenuInflater().inflate(R.menu.menu_popup, popupMenu.getMenu());
    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {

            }
            return true;
        }
    });
    popupMenu.show();
}

在您的适配器类中。

注意:act是创建构造器适配器时必须绑定的Activity,例如:

public YourAdapter(Activity act, ArrayList<ItemOfYourModel> data){
    this.data = data;
    this.act = act;
}

在Activity中,你可以编码:

ArrayList<ItemOfYourModel> listData = new ArrayList<ItemOfYourModel>();
listData.add(new YourItemOfYourModel(...));
YourAdapter adapter = new YourAdapter(this,listData);

【讨论】:

  • 如何在适配器中绑定行为请详细描述一下?
  • @Harshad,您使用了哪个适配器和活动?你用的是listview还是recyclerview?
  • listview 和 BaseAdapter
  • @Harshad,请参阅我的新更新答案。希望能帮到你
【解决方案2】:

您可以在不使用 xml 文件的情况下以编程方式添加这些选项,如下所示,这可能会对您有所帮助。

这里 ONE 和 TWO 显示您在弹出菜单中提供的选项的索引。就像在第一个位置 EDIT POST 在第二个位置 REMOVE POST 等等。

1) 在图片上点击打开弹出菜单:

private final static int ONE = 1;
private final static int TWO = 2;

PopupMenu popupMenu = new PopupMenu(this, findViewById(R.id.img_detail_information_options));
popupMenu.getMenu().add(Menu.NONE, ONE, Menu.NONE, getResources().getString(R.string.detail_information_edit_post));
popupMenu.getMenu().add(Menu.NONE, TWO, Menu.NONE, getResources().getString(R.string.detail_information_remove_post));
popupMenu.setOnMenuItemClickListener(this);
popupMenu.show();

【讨论】:

  • ONE 和 TWO 未找到,还有 popupMenu.setOnMenuItemClickListener(this);给我错误。
  • ONE 和 TWO 显示选项菜单的索引,您可以设置 int 数字代替 ONE 和 TWO,并且 popupMenu.setOnMenuItemClickListener(this);给出错误是因为您没有在活动中实现 PopupMenu.OnMenuItemClickListener 或者您可以简单地将其替换为这个 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener());
  • 编辑答案并写完整的描述我听不懂你。
  • 我试过 popupMenu.setOnMenuItemClickListener(this);线给我红色信号。
【解决方案3】:

您可以使用 ListPopupWindow 来获得您想要实现的目标。您可以将更多选项图标或菜单图标设置为弹出窗口的锚点。

ListPopupWindow mListPopupWindow;
mListPopupWindow = new ListPopupWindow(this, null);
mListPopupWindow.setWidth(300);
mListPopupWindow.setAnchorView(menuIcon);
mListPopupWindow.setHeight(200);
mListPopupWindow.setAdapter(yourAdapter);
mListPopupWindow.show();

你会得到你想要的。

【讨论】:

  • 你遇到了什么问题?
  • 它显示中心我想要它动态?
  • 你一定是做错了什么。它将根据您指定的锚点显示。如果我能管理,我会为你发布工作代码。
【解决方案4】:

我认为最好的解决方案是使用 PopupWindow ,你可以控制它的每一件事,并且很容易创建你想要的菜单。

【讨论】:

    【解决方案5】:

    Google Play 将Holo 主题用于PopupMenu。你可以通过在你的styles.xml中创建一个自定义style来做同样的事情:

    <style name="PopupMenuStyle" parent="android:Theme.Holo.Light">
            <!-- Your custom attributes must be put here. This is optional, but the parent must not be changed -->
    </style>
    

    然后在您的代码中更改PopupMenu 样式:

    Context wrapper = new ContextThemeWrapper(this, R.style.PopupMenuStyle);
    PopupMenu popupMenu = new PopupMenu(wrapper,view);
    

    【讨论】:

    • 我用过这个但是像 ContextMenu 一样在中心显示菜单我想要 ListView 的每一行。
    • 您必须在整个视图上设置此项。相反,在列表项中添加一个类似 Google play 的按钮。那么它就不会出现在中心了。
    • 如何设置宽度和高度是我的第一个问题条件。
    • 对于 PopupMenu,你不能。您在菜单中看到的每个项目的白色背景都是固定大小的可绘制的。大小是菜单的理想大小,但如果您仍想更改大小,请使用 PopupWindow。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多