操作栏中按钮点击弹出菜单

6

我正在尝试实现一个操作栏,其中一个按钮在单击时显示弹出菜单。 以下是菜单的XML(操作栏中的菜单项):

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

<item
    android:id="@+id/search"
    android:icon="@drawable/ic_action_search"
    android:orderInCategory="0"
    android:showAsAction="always"
    android:title="@string/menu_search"/>
<item
    android:id="@+id/refresh"
    android:icon="@drawable/ic_action_refresh"
    android:orderInCategory="1"
    android:showAsAction="always"
    android:title="@string/menu_refresh"/>


 <Item
    android:id="@+id/popup"
    android:icon="@drawable/ic_action_search"
    android:onClick="showPopup"
    android:orderInCategory="1"
    android:showAsAction="always"
    android:title="@string/menu_search" />

我希望在点击id为"@+id/popup"的项目时显示一个弹出菜单。

以下是弹出菜单的XML代码:

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

<item
    android:id="@+id/item1"
    android:icon="@drawable/ic_action_search"
    android:orderInCategory="0"
    android:showAsAction="always"
    android:title="@string/menu_search"/>
<item
    android:id="@+id/item2"
    android:icon="@drawable/ic_action_search"
    android:orderInCategory="1"
    android:showAsAction="always"
    android:title="@string/menu_search"/>

这是按钮的 onClick 方法。
public void showPopup(View v) {
    PopupMenu popup = new PopupMenu(this, v);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.overflow, popup.getMenu());
    popup.show();
}

问题在于点击按钮时没有弹出窗口。需要大家的帮助。


你确定 showPopup 被调用了吗?也许 onClick 没有正确地注册? - Gophermofur
我不确定 onClick 是否正确注册。 - darsh
1
在showPopup方法中设置log.d或断点,看它们是否会打印出任何内容/被触发。如果这样可以,请专注于showPopup方法内部的代码。 - Gophermofur
6个回答

17

我在这里找到了这个: http://developer.android.com/guide/topics/ui/menus.html

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

    <item android:id="@+id/selectImg"
        android:icon="@android:drawable/ic_dialog_dialer"
        android:showAsAction="always">

        <menu>
            <item android:id="@+id/top"
                android:title="@string/topimg"/>
            <item android:id="@+id/bottom"
                android:title="@string/botimg" />
        </menu>

    </item>
</menu>

当项目被点击时,您可以将菜单放在菜单中以呈现子菜单。然后,在Java中,您可以像往常一样使用相同的方法。

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle presses on the action bar items
       // View v = findViewById(R.id.f);
        switch (item.getItemId()) {
            case R.id.top:
                //action
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

即使它是子菜单,xml中的“top”的id仍然被识别。这对我很有效,并且看起来就像弹出菜单。


13

大家好,这是我的解决方案:我创建了showPopup方法,然后在onOptionsItemSelected中这样调用它:

public void showPopup(){
    View menuItemView = findViewById(R.id.menu_save);
    PopupMenu popup = new PopupMenu(getActivity(), menuItemView);
    MenuInflater inflate = popup.getMenuInflater();
    inflate.inflate(R.menu.popup, popup.getMenu());
    popup.show();

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.menu_save:    
        showPopup();
        return true;
    default:
        return super.onOptionsItemSelected(item);
}

}

popup.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:id="@+id/decon"
    android:showAsAction="ifRoom"
    android:title="@string/decon"/>

<item
    android:id="@+id/mRes"
    android:showAsAction="ifRoom"
    android:title="@string/mesRes"/>

</menu>
被称为onCreateOptionsMenu
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/menu_save"
    android:enabled="true"
    android:icon="@drawable/action_save"
    android:showAsAction="ifRoom|withText"
    android:title="@string/action_save"
    android:visible="true"/>

</menu>

最终我……
implements PopupMenu.OnMenuItemClickListener to @Override onMenuItemClick method.

非常感谢,真的帮了大忙。 - Rijul Gupta

3
作为弹出菜单是一个MENU,您需要通过实现"onOptionsItemSelected"来处理它。您将能够针对每个菜单选项指定要执行的操作。它将替换您定义的"onClick"选项,并会自动地调用。

2
尝试将“this”更改为“getActivity()”。
public void showPopup(View v) {
    PopupMenu popup = new PopupMenu(getActivity(), v);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.overflow, popup.getMenu());
    popup.show();
}

希望能帮到您..!!

请尝试访问以下链接:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/PopupMenu1.html。但我猜您可能正在做相同的事情。 - Rookie

1
我找到了解决方法。不是使用菜单XML来填充弹出菜单,而是创建了一个XML布局文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#8b8989"
android:orientation="vertical"
android:padding="10dip" >

<TextView
    android:id="@+id/menuItem1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip"
    android:text="@string/menu1" />

<TextView
    android:id="@+id/menuItem2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip"
    android:text="@string/menu2" />
<TextView
    android:id="@+id/menuItem3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip"
    android:text="@string/menu3" />
</LinearLayout> 

我修改了 onClick 方法

public void showPopup(View v) {
    LayoutInflater inflater = (LayoutInflater) MainActivity.this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        PopupWindow pw = new PopupWindow(inflater.inflate(
                R.layout.overflow_layout, null, false), 300, 400, true);
        pw.showAtLocation(findViewById(R.id.container), Gravity.CENTER, 0,
                0);
}

问题已解决


每次都充气布局很耗费资源。有一种更干净、高效和健壮的方法来解决这个问题。看看我的答案。 - Nlinscott

0
android:onClick="popup"

也许你应该将它改为android:onClick="showPopup"


哦,抱歉,那个问题是错误的。实际上它是一样的,我正在编辑问题。 - darsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接