Android中setIcon什么作用,android – MenuItem.setIcon()方法不起作用

在Android应用中遇到一个问题,即尝试更改菜单项的图标但无效果。代码显示在`onCreateOptionsMenu`和`onPrepareOptionsMenu`中设置了图标,并在`changeStar`方法中根据条件切换图标。尽管日志显示方法被正确调用,图标仍然没有改变。解决方案是将图标更改的逻辑移到`onPrepareOptionsMenu`并调用`invalidateOptionsMenu()`来刷新菜单。这样做是因为`onPrepareOptionsMenu`会在菜单显示前被调用,适合进行动态修改菜单内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我已经尝试过所有可能的解决方案.这是我的代码:

private Menu mMenu;

@Override

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

inflater.inflate(R.menu.fragment_article_detail_menu, menu);

mMenu = menu;

}

void changeStar(boolean added) {

if (mMenu != null) {

MenuItem item = mMenu.findItem(R.id.favourites_item);

if (added) {

Log.d(LOG_TAG, "Set full icon");

item.setIcon(getResources().getDrawable(R.drawable.star_full));

} else {

Log.d(LOG_TAG, "Set empty icon");

item.setIcon(getResources().getDrawable(R.drawable.star_empty));

}

}

}

这是我的菜单xml文件:

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

tools:context="ssidit.pp.ua.payspacereader.ArticleDetailActivity">

android:id="@+id/refresh_item"

android:title="@string/refresh"

app:showAsAction="never">

android:id="@+id/favourites_item"

android:icon="@drawable/star_empty"

android:title="@string/add_to_favourite"

app:showAsAction="ifRoom">

android:id="@+id/share_item"

android:icon="@drawable/ic_share"

android:title="@string/share"

app:actionProviderClass="android.support.v7.widget.ShareActionProvider"

app:showAsAction="ifRoom">

invalidateMenu()方法没有帮助.当我调用setIcon方法时,我的Android设备上没有任何变化.

这是我的代码:

private boolean isFavourite;

private void setValues(Cursor cursor) {

Log.d(LOG_TAG, "Setting values");

setData(titleTextView, CursorUtility.getTitle(cursor));

setData(dateTextView, CursorUtility.getDateText(cursor));

setData(timeTextView, CursorUtility.getTimeText(cursor));

isFavourite = CursorUtility.isFavourite(cursor);

getActivity().invalidateOptionsMenu();

}

@Override

public void onPrepareOptionsMenu(Menu menu) {

super.onPrepareOptionsMenu(menu);

Log.d(LOG_TAG, "OnPrepareOptionsMenu");

MenuItem item = menu.findItem(R.id.favourites_item);

if (isFavourite) {

Log.d(LOG_TAG, "Set full icon");

item.setIcon(R.drawable.star_full);

} else {

Log.d(LOG_TAG, "Set empty icon");

item.setIcon(R.drawable.star_empty);

}

}

如您所见,所有内容都已记录.因此,如果某些方法不调用则不会出错.我也通过获得它的标题来检查项目.这是正确的项目.只是某种黑魔法.

解决方法:

尝试使用invalidateOptionsMenu并将您的changeStar逻辑移动到onPrepareOptionsMenu.从Android documentation开始:

public boolean onPrepareOptionsMenu (Menu menu)

Added in API level 1

Prepare the Screen’s standard options menu to be displayed. This is called right before the menu is shown, every time it is shown. You can use this method to efficiently enable/disable items or otherwise dynamically modify the contents.

The default implementation updates the system menu items based on the activity’s state. Deriving classes should always call through to the base class implementation.

标签:android,icons,menuitem,menu

来源: https://codeday.me/bug/20190702/1357578.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值