Android:如何动态更改ActionBar图标?

24

我希望动态更改ActionBar中的“home”图标。在v14中,可以通过ActionBar.setIcon(...)轻松实现此目标,但我找不到在早期版本中完成此操作的任何方法。


当您调用 setIcon 时,会发生任何事情吗?如果您正在尝试在早期版本的 Android 上实现某些功能,您应该查看 ActionBarSherlock - adneal
我正在使用一个类似于ActionBarSherlock的自定义ActionBar组件,用于v11-v13(蜂窝)之前的版本。当我在蜂窝版本中调用setIcon时,会出现方法未找到的异常。 - ab11
setIcon仅适用于API级别>=14。 - Sandra
4个回答

22

如果你的ActionBar的工作方式类似于Sherlock并且基于菜单项的话,这是我的解决方案:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem switchButton = menu.findItem(R.id.SwitchSearchOption);     
    if(searchScriptDisplayed){
        switchButton.setIcon(R.drawable.menu_precedent);
    }else{
        switchButton.setIcon(R.drawable.icon_search);
    }
    return super.onPrepareOptionsMenu(menu);

}

嗯,对于蜂巢版本,我使用sdk提供的ActionBar。因此,我正在尝试找到v14中提供的ActionBar.setIcon()方法的蜂巢版本。 - ab11
2
感谢这个很棒的代码片段 - 我已经寻找了一段时间! - aaronsnoswell
它适用于所有项。但如果我用它来处理主页图标(android.R.id.home),我会遇到空指针异常崩溃。 - tobias

16
如果你正在使用由Google提供的ActionbarCompat代码,那么你可以通过ActionBarHelperBase.java类来访问API v4及以上版本中的主页图标。
    //code snippet from ActionBarHelperBase.java
    ...
    private void setupActionBar() {
    final ViewGroup actionBarCompat = getActionBarCompat();
    if (actionBarCompat == null) {
        return;
    }

    LinearLayout.LayoutParams springLayoutParams = new LinearLayout.LayoutParams(
            0, ViewGroup.LayoutParams.MATCH_PARENT);
    springLayoutParams.weight = 1;

    // Add Home button
    SimpleMenu tempMenu = new SimpleMenu(mActivity);
    SimpleMenuItem homeItem = new SimpleMenuItem(tempMenu,
            android.R.id.home, 0, mActivity.getString(R.string.app_name));
    homeItem.setIcon(R.drawable.ic_home_ftn);
    addActionItemCompatFromMenuItem(homeItem);

    // Add title text
    TextView titleText = new TextView(mActivity, null,
            R.attr.actionbarCompatTitleStyle);
    titleText.setLayoutParams(springLayoutParams);
    titleText.setText(mActivity.getTitle());
    actionBarCompat.addView(titleText);
}
...
你应该能够修改代码,使主页按钮对扩展ActionBarActivity的活动可访问,并通过这种方式进行更改。Honeycomb似乎要困难一些,它似乎没有提供这样的简单访问。猜测其ID也应该是android.R.id.home,因此你可以从ActionBarHelperHoneycomb.java中的视图中提取它。

5
是的!谢谢。Activity.findViewById(android.R.id.home)可以使用。 - ab11

1
我会这样说:

我会这样做:

getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_drawer);

请查看链接 如何更改actionBarCompat图标


0

如果在清单文件中提供了android:logo属性,ActionBar将使用它。这使您可以为图标(启动器)和徽标(ActionBar等)使用单独的可绘制资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接