13

我的选项菜单中有这个项目:

<item
    android:id="@+id/opt_mnu_action"
    android:icon="@android:drawable/ic_dialog_info"
    android:orderInCategory="1"
    android:showAsAction="ifRoom"
    android:title="New">
</item>

在主 FragmentActivity 中创建的菜单本身。我想根据打开的 Fragment 以编程方式更改此项目的图标,并且显然,当用户点击此按钮时会有不同的操作。我尝试了几件事来做到这一点,但没有任何效果。我尝试的最后一件事是我的 Fragment 的 onCreateView 方法中的这段代码:

MenuItem mi = (MenuItem) view.findViewById(R.id.opt_mnu_action);
mi.setIcon(R.drawable.ico_1);

但是我的应用程序崩溃了。那么有没有办法做到这一点?

**更新**

这就是我现在要做的事情,全部在我的主要主要 FragmentActivity 中: 首先,MenuItem action_button;我的层次结构视图中有一个。然后在我的onCreateOptionsMenu方法中实例化它:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);
    action_button = menu.findItem(R.id.opt_mnu_action);
    return super.onCreateOptionsMenu(menu);
}

然后我创建了这个函数来根据打开的选项卡更改图标:

public void change_action_button_icon(int tab_position)
{
    switch(tab_position)
    {
    case 0:
        action_button.setIcon(R.drawable.ico_1);
        break;
    case 1:
        action_button.setIcon(R.drawable.ico_2);
        break;
    case 2:
        action_button.setIcon(R.drawable.ico_3);
        break;
    }
    invalidateOptionsMenu();
}

我在我的onTabSelected方法中调用它:

public void onTabSelected(ActionBar.Tab tab,
        FragmentTransaction fragmentTransaction) {
    mViewPager.setCurrentItem(tab.getPosition());
    setTab_position(tab.getPosition());
    change_action_button_icon(tab.getPosition());
}

但是一旦我启动我的应用程序 - 它就会崩溃。我NullPointerException在这一行得到错误:

action_button.setIcon(R.drawable.ico_1);

action_button我的猜测 - 发生这种情况是因为在实例化之前请求了图标更改。但我不知道如何克服它...

4

3 回答 3

19

使用它来获取对菜单项的引用:

    menu.findItem(resourceId).setIcon(drawableId);

您必须将代码更改为 onCreateOptionsMenu() 中的图标。

请参考我下面的例子:

    public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    getMenuInflater().inflate(R.menu.option_menu, menu);

    if (needToChangeMenuItem){

        menu.findItem(resourceId).setIcon(drawableId);
    }

    manageMenuIcon(menu);

    needToChangeMenuItem = false;


    return true;
}


    public void manageMenuIcon(Menu menu){
    if (bluetoothIconOn){
        menu.findItem(R.id.secure_connect_scan).setIcon(R.drawable.bluetoothon);
    } else
        menu.findItem(R.id.secure_connect_scan).setIcon(R.drawable.bluetoothoff);

    if (gpsIconOn)
        menu.findItem(R.id.gps).setIcon(R.drawable.gps);
    else
        menu.findItem(R.id.gps).setVisible(false);

    if (slipAndDropIconOn)
        menu.findItem(R.id.fall).setIcon(R.drawable.fall);
    else
        menu.findItem(R.id.fall).setVisible(false);

    if (fesConnectIconOn)
        menu.findItem(R.id.fesConnection).setIcon(R.drawable.fesconnect);
    else
        menu.findItem(R.id.fesConnection).setVisible(false);


}


    public void changeMenuItem(int resId, int draId){


    needToChangeMenuItem = true;
    resourceId = resId;
    drawableId = draId;

    invalidateOptionsMenu();        


}
于 2013-12-16T15:38:56.277 回答
0
MenuItem mi = (MenuItem) view.findViewById(R.id.opt_mnu_action);
mi.setIcon(R.drawable.ico_1);

在您的 Fragment 中onCreateOptionsMenu,加载此菜单,并保留对菜单项的引用(它不是片段视图层次结构的一部分,因此您不能使用 findViewById)。

当您准备好更新图标时,使用mi.setIcon(R.drawable.ico_1); 并调用invalidateOptionsMenu().

更新:

return super.onCreateOptionsMenu(menu);

这实际上将返回 false,因为基本实现不这样做。而是跳过它,或者只是super.onCreateOptionsMenu(menu);先打电话,做你的事情然后返回true。

于 2013-10-04T16:48:14.427 回答
0

首先将 actionOverFlowButtonStyle 添加到您的主题中

<style name="AppTheme" parent="AppBaseTheme">

    <item name="android:actionOverflowButtonStyle">@style/MyActionButtonOverflow</item>
</style>

定义流按钮的新样​​式

<style name="MyActionButtonOverflow" parent="android:style/Widget.Holo.Light.ActionButton.Overflow">
    <item name="android:src">@drawable/ic_menu</item>
</style>
于 2018-03-09T05:20:01.137 回答