6

I have a PopupMenu with 4 options: add as friend, as neighbour, as workmate and as fan. What I want to do is if you click, lets say, on "Add as friend", then that option changes into "remove friend".

Here's what I've tried so far:

Activity:

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>
Cœur
  • 37,241
  • 25
  • 195
  • 267
guillefix
  • 934
  • 1
  • 13
  • 30
  • add all items to the menu and change their visibility according to your needs. i don't think u can change the text – itzhar Jul 03 '18 at 10:33
  • refer to this https://stackoverflow.com/questions/7066657/android-how-to-dynamically-change-menu-item-text-outside-of-onoptionsitemssele – Anjani Mittal Jul 03 '18 at 10:55
  • Where do you click? Is it a ListView or RecyclerView item, or a simple view like a TextView? –  Jul 03 '18 at 11:19

3 Answers3

10

I've found a solution. I added 4 boolean variables and modified the showPopup and addContact methods like this:

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;
     }
 }
guillefix
  • 934
  • 1
  • 13
  • 30
1

Inflate another menu when showing popup again.

  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();
}
vbp
  • 1,157
  • 10
  • 16
0

kotlin solution:

var popup = PopupMenu(this,view)
popup.inflate(R.menu.my_popup)
popup.menu[0].title = "custom string"
popup.show()
thefatb0b
  • 43
  • 7
  • 1
    Please read [answer] and [edit] your answer to contain an explanation as to why this code would actually solve the problem at hand. Always remember that you're not only solving the problem, but are also educating the OP and any future readers of this post. – Adriaan Mar 02 '23 at 09:24