【问题标题】:Popup menu on click of a button in action Bar单击操作栏中的按钮时弹出菜单
【发布时间】:2012-05-16 01:13:49
【问题描述】:

我正在尝试实现一个操作栏,其中一个单击按钮会显示一个弹出菜单。 这是菜单。 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 没有正确注册?
  • 我不确定 onClick 是否正确注册。
  • 在 showPopup 方法中设置 log.d 或断点,看看它们是否打印出任何内容/被命中。如果可行,那么您可以专注于 showPopup 中的代码。

标签: android popup android-actionbar


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常感谢,真的很有帮助。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      尝试将 '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();
      }
      

      希望对您有所帮助..!!

      【讨论】:

      【解决方案5】:

      我找到了解决方案。我没有使用菜单 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);
      }
      

      这解决了问题

      【讨论】:

      • 每次都膨胀一个布局是很昂贵的。有一种更清洁、更有效和更强大的方法可以做到这一点。看我的回答
      【解决方案6】:
      android:onClick="popup"
      

      也许你应该把它改成android:onClick="showPopup"

      【讨论】:

      • 哦,抱歉,这是问题中的错误。它实际上是一样的,我正在编辑问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多