簡體   English   中英

在“ActionBar”項目點擊顯示彈出菜單

[英]Show popup menu on `ActionBar` item click

我有一個帶有操作項的ActionBar 單擊操作項后,我想顯示一個彈出菜單。 我實現了這個方法,但我想將它錨定到操作項或ActionBar ,而不是布局中的任何視圖。 如何從MenuItem獲得某種視圖來錨定它?

public boolean onOptionsItemSelected(MenuItem item) {
    PopupMenu popupMenu = new PopupMenu(this, ??????); // What view goes here?
    popupMenu.inflate(R.menu.counters_overflow);
    popupMenu.show();
    // ...
    return true;
}

所以最后我找到了解決方案。 當您想將彈出菜單錨定到 ActionBar 中的 ActionItem 時,您需要找到呈現 ActionItem 的視圖。 使用 findViewById() 的簡單查找視圖,其中 id 與 xml 中菜單項的 id 相同。

顯示彈窗:

public boolean onOptionsItemSelected(MenuItem item) {
    // ...

    View menuItemView = findViewById(R.id.menu_overflow); // SAME ID AS MENU ID
    PopupMenu popupMenu = new PopupMenu(this, menuItemView); 
    popupMenu.inflate(R.menu.counters_overflow);
    // ...
    popupMenu.show();
    // ...
    return true;
}

菜單:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

     ....

     <item
    android:id="@+id/menu_overflow"
    android:icon="@drawable/ic_overflow"
    android:showAsAction="ifRoom"
    android:title="@string/menu_overflow"/>

     ....

</menu>

如果菜單項不可見(溢出),則它不起作用。 findViewById 返回 null,因此您必須檢查這種情況並錨定到另一個視圖。

接受的答案對我不起作用,所以我通過反復試驗發現了問題。

public boolean onOptionsItemSelected(MenuItem item) 
{
    View menuItemView = findViewById(item.getItemId()); 
    showPopupMenu(menuItemView)

    return true;
}

private void showPopupMenu(View anchor)
{
    PopupMenu popup = new PopupMenu(this, anchor);
    popup.getMenuInflater().inflate(R.menu.my_popup_menu, popup.getMenu());
    popup.show();
}

這里的關鍵是, onOptionsItemSelected(MenuItem item) item的項目必須顯示在 ActionBar 上。 如果該item是您按下 ActionBar 右上角的 3 個垂直點時出現的項目之一,那么您的應用程序將崩潰。

在此處輸入圖像描述

請試試這個..

  @Override
public boolean onOptionsItemSelected(MenuItem item){
    String str=item.getTitle().toString(); 
    Toast.makeText(getBaseContext(), str,Toast.LENGTH_LONG). show();

    View view=findViewById(item.getItemId()); 
    switch(view.getId()){
        case Menu.FIRST:
            showPopup(view); // calling method
    }

    return super.onOptionsItemSelected(item);
}   

// custom method
private void showPopup(final View view) {
    PopupMenu popupMenu = new PopupMenu(view.getContext(), view);
    popupMenu.getMenu().add(0, 0, Menu.NONE, "Item 1");
    popupMenu.getMenu().add(0, 1, Menu.NONE, "Item 2");
    popupMenu.getMenu().add(0, 2, Menu.NONE, "Item 3");
    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(view.getContext(), item.getTitle() + "clicked", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
    popupMenu.show();
}

除了接受的答案之外,在每次調用 onOptionsItemSelected() 方法時重新膨脹彈出窗口的問題可以通過只執行一次並且只顯示我們想要的次數來簡化。
(這甚至適用於在運行時通過 Menu Layout Inflater 膨脹的自定義工具欄。請記住,獲取菜單項視圖的 findViewById() 只能在視圖實際出現在屏幕上時返回非空值,即應該在工具欄/操作欄上可見。

注意:如果視圖預設在工具欄/操作欄的溢出菜單中,則視圖可能只有在溢出菜單至少被調用一次后才會膨脹——使用 3 個點?)

public class SomeActivity{
    
    private PopupMenu popup;
    .... // some code of the activity

@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int menuItem = item.getItemId();
        switch (menuItem) {
            case R.id.tb_menu_plus:
                View menuItemView = findViewById(R.id.tb_menu_plus);
                if(popup == null) {
                    popup = new PopupMenu(this, menuItemView);
                    popup.inflate(R.menu.dropdown_popup_menu);
                }
                popup.show();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

在此處輸入圖像描述

如果您不希望在單擊特定項目時菜單消失,則在該項目上return false

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId())
        {
            case R.id.itemShare_:
                onShareClicked();
                return true;    // the menu will be gone
            case R.id.itemCopy_:
                onCopyClicked();
                return true;    // the menu will be gone
            case R.id.itemSelectAll_:
                onSelectAllClicked();
                return false;   // the menu will stay

               // ...
       }
public boolean onOptionsItemSelected(MenuItem item) {
    final View addView = getLayoutInflater().inflate(R.layout.add, null);

            new AlertDialog.Builder(this).setTitle("Add a Word").setView(addView)
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            addWord((TextView) addView.findViewById(R.id.title));
                        }
                    }).setNegativeButton("Cancel", null).show();
return (super.onOptionsItemSelected(item));
    }

在這里獲取完整的源代碼..

http://vimaltuts.com/android-tutorial-for-beginners/android-action-bar-tab-menu-example

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM