代码之家  ›  专栏  ›  技术社区  ›  guillefix

以编程方式更改弹出菜单项的标题

  •  2
  • guillefix  · 技术社区  · 6 年前

    我有一个弹出式菜单,有4个选项:添加为朋友、邻居、同事和粉丝。我想做的是,如果你点击“添加为好友”,那么这个选项就会变成“删除好友”。

    我一直在stackoverflow中寻找一些解决方案,但它们似乎都不适合我。到目前为止,我一直在尝试:

    活动:

    private Menu menuOpts;
    
    public void showPopup(View v) {
        Context wrapper = new ContextThemeWrapper(this, R.style.PopupPerfilAjeno);
        PopupMenu popup = new PopupMenu(wrapper, v);
        popup.setOnMenuItemClickListener(this);
        popup.inflate(R.menu.menu);
        popup.show();
    
        menuOpts = popup.getMenu();
    }
    
    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.add_friend:
                String add_as_friend = getString(R.string.add_as_friend );
    
                if (item.getTitle().toString().equals(add_as_friend )) {
                    addContact(1, item);
                }
                else {
                    removeContact(1, item);
                }
                return true;
            case R.id.add_workmate:
                //
                return true;
            case R.id.add_neighbour:
                //
                return true;
            case R.id.add_fan:
                //
                return true;
            default:
                return false;
        }
    }
    // circle: 1 = friend, 2 = workmate, 3 = neighbour, 4 = fan
    private void addContact(final int circle, final MenuItem item) {
    
        switch (circle) {
            case 1:
                menuOpts.findItem(R.id.add_friend).setTitle(R.string.remove_friend);
                 // this won't work either:
                 // item.setTitle(R.string.remove_friend);
                 break;
            case 2:
                menuOpts.findItem(R.id.add_workmate).setTitle(R.string.remove_workmate);
                 break;
            case 3:
                menuOpts.findItem(R.id.add_neighbour).setTitle(R.string.remove_neighbour);
                 break;
            case 4:
                menuOpts.findItem(R.id.add_fan).setTitle(R.string.remove_fan);
                 break;
         }
     }
    

    menu.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:id="@+id/add_friend"
            android:orderInCategory="100"
            android:title="@string/add_as_friend"
            app:showAsAction="always" />
        <item
            android:id="@+id/add_workmate"
            android:orderInCategory="100"
            android:title="@string/add_as_workmate"
            app:showAsAction="always" />
        <item
            android:id="@+id/add_neighbour"
            android:orderInCategory="100"
            android:title="@string/add_as_neighbour"
            app:showAsAction="always" />
        <item
            android:id="@+id/add_fan"
            android:orderInCategory="100"
            android:title="@string/add_as_fan"
            app:showAsAction="always" />
    </menu>
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   guillefix    6 年前

    我找到了解决办法。我添加了4个布尔变量并修改了showPopup和addContact方法,如下所示:

    private boolean friend, workmate, neighbour, fan;
    
    public void showPopup(View v) {
        Context wrapper = new ContextThemeWrapper(this, R.style.PopupPerfilAjeno);
        PopupMenu popup = new PopupMenu(wrapper, v);
        popup.setOnMenuItemClickListener(this);
        popup.inflate(R.menu.menu);
    
        Menu menuOpts = popup.getMenu();
    
        if (friend) {
            menuOpts.getItem(0).setTitle(R.string.remove_friends);
        }
        if (workmate) {
            menuOpts.getItem(1).setTitle(R.string.remove_workamtes);
        }
        if (neighbour) {
            menuOpts.getItem(2).setTitle(R.string.remove_neighbours);
        }
        if (fan) {
            menuOpts.getItem(3).setTitle(R.string.remove_fans);
        }
    
        popup.show();
    }
    
    private void addContact(final int circle) {
    
        switch (circle) {
            case 1:
                 friend = true;
                 workmate = false;
                 neighbour = false;
                 fan = false;
                 break;
            case 2:
                 friend = false;
                 workmate = true;
                 neighbour = false;
                 fan = false;
                 break;
            case 3:
                 friend = false;
                 workmate = false;
                 neighbour = true;
                 fan = false;
                 break;
            case 4:
                 friend = false;
                 workmate = false;
                 neighbour = false;
                 fan = true;
                 break;
         }
     }
    
        2
  •  0
  •   kttn    6 年前

    再次显示弹出菜单时,请为另一个菜单充气。

      public void showPopup(View v) {
        Context wrapper = new ContextThemeWrapper(this, R.style.PopupPerfilAjeno);
        PopupMenu popup = new PopupMenu(wrapper, v);
        popup.setOnMenuItemClickListener(this);
        if (condition) popup.inflate(R.menu.menu);
        else popup.inflate(R.menu.menu2);
        popup.show();
    
        menuOpts = popup.getMenu();
    }