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

时间:2012-05-07 14:11:17

标签: android popup android-actionbar

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

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

6 个答案:

答案 0 :(得分:15)

我在这里找到了这个: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。这对我有用,它看起来就像弹出菜单。

答案 1 :(得分:14)

  

大家好,这是我自己的解决方案:我创建了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>
  

main.xml =&gt;它被称为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.

答案 2 :(得分:3)

由于弹出菜单是MENU,您必须通过实现“onOptionsItemSelected”来处理此问题。您将能够为每个菜单选项说明要做什么。它将取代您定义的“onClick”选项,并将自动调用。

答案 3 :(得分: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();
}

希望它有所帮助.. !!

答案 4 :(得分: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);
}

这解决了问题

答案 5 :(得分:0)

android:onClick="popup"

可能应该将其更改为android:onClick="showPopup"