5

我正在尝试实现一个操作栏,其中单击按钮之一显示弹出菜单。这是菜单。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();
}

问题是单击该按钮时没有弹出窗口。需要帮助的人。

4

6 回答 6

16

我在这里找到了这个: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 仍然可以识别,即使它是子菜单。这对我有用,它看起来就像弹出菜单。

于 2014-02-25T07:01:35.407 回答
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);
}

}

弹出.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>

main.xml => 它被称为 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.
于 2013-05-09T22:55:20.797 回答
3

由于弹出菜单是一个 MENU,您必须通过实现“onOptionsItemSelected”来处理这个问题。您将能够说出每个菜单选项的操作。它将替换您定义的“onClick”选项并自动调用。

于 2012-05-07T14:26:35.687 回答
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();
}

希望能帮助到你..!!

于 2012-05-07T14:45:43.937 回答
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);
}

这解决了这个问题

于 2012-05-08T11:41:15.567 回答
0
android:onClick="popup"

可能你应该把它改成android:onClick="showPopup"?

于 2012-05-07T14:18:15.300 回答