Программно изменять заголовок элементов PopupMenu

У меня есть PopupMenu с 4 вариантами: добавить как друга, как соседа, как напарника и как поклонника. Что я хочу сделать, так это если вы, скажем, нажмете «Добавить в друзья», тогда эта опция изменится на «Удалить друга».

Вот что я пробовал до сих пор:

Мероприятия:

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>

добавить все элементы в меню и изменить их видимость в соответствии с вашими потребностями. я не думаю, что ты можешь изменить текст

itzhar 03.07.2018 12:33

обратитесь к этому stackoverflow.com/questions/7066657/…

Anjani Mittal 03.07.2018 12:55

Куда щелкнуть? Это элемент ListView или RecyclerView или простое представление, такое как TextView?

user8959091 03.07.2018 13:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
4 018
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Расширьте другое меню, когда снова отобразите всплывающее окно.

  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();
}
Ответ принят как подходящий

Я нашел решение. Я добавил 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;
     }
 }

Другие вопросы по теме