Почему я не могу вызвать setAlpha для значка в MenuItem

#java #android #icons #drawable #menuitem

#java #Android #Значки #можно рисовать #menuitem

Вопрос:

Я застрял, пытаясь просто изменить прозрачность этого MenuItem значка в течение нескольких часов… Я не уверен, что еще делать. Я могу успешно вызвать setEnable() значок, что означает, что проблема не в доступе к нему. Это должно иметь какое-то отношение к самому значку. Я использую стандартную тему материала, которая поставляется с «Базовым шаблоном действий», может ли стиль или тема даже помешать мне программно изменить его? Я звоню onPrepareOptionsMenu из фрагмента, может ли это быть проблемой? Вот мой код:

 @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);

    // top menu (action bar)
    inflater.inflate(R.menu.menu_searches, menu);

    // bottom menu (the one I am having an issue with)
    Menu bottomMenu = toolbarBottom.getMenu();

    // the MenuItem I am trying to call "setAlpha()" on
    deleteMenuItem = bottomMenu.findItem(R.id.action_delete);

    for (int itemIndex = 0; itemIndex < bottomMenu.size(); itemIndex  ) {
        bottomMenu.getItem(itemIndex).setOnMenuItemClickListener(new
            MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                return onOptionsItemSelected(item);
            }
        });
    }
}

@Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        if (itemsChecked > 0) {
            deleteMenuItem.setEnabled(true);
            
            /* I have also tried "delete.getIcon().mutate().setAlpha(255);" -
- but I do not have another instance of the icon so I don't think I need to -
- call "mutate()". It didn't work anyways */
            deleteMenuItem.getIcon().setAlpha(255);

        } else {
            deleteMenuItem.setEnabled(false);
            deleteMenuItem.getIcon().setAlpha(5);
        }
    }
  

Ответ №1:

menu.findItem() он отстает, и вызов его внутри onPrepareOptionsMenu(Menu menu) приводит к плохому взаимодействию с пользователем. Лучше получить MenuItem объект один раз при создании меню, а затем просто вызывать setAlpha каждый раз, когда меню появляется на экране. Вы можете попробовать

 MenuItem mDynamicMenuItem;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    // Get dynamic menu item
    mDynamicMenuItem = menu.findItem(R.id.menu_item);
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    // Here is just a good place to update item
    MenuItem delete = mDynamicMenuItem.findItem(R.id.action_delete);

    if (itemsChecked > 0) {
        delete.setEnabled(true);
        delete.getIcon().setAlpha(255);

    } else {
        delete.setEnabled(false);
        delete.getIcon().mutate().setAlpha(5);
        delete.getIcon().setAlpha(5);
    }
    return true;
}
  

Комментарии:

1. Эй, Нонакун, спасибо за ответ, но это пока не решило мою проблему. Я спросил, что вы предложили и переместили MenuItem.findItem() вызов, но я все еще не могу изменить прозрачность MenuItem. Есть предложения?