搜索视图使用应用图标而不是徽标

时间:2013-05-14 13:07:17

标签: android android-actionbar actionbarsherlock

Android文档说明app logo在定义时随处可用。但是当搜索视图展开时,会使用应用图标而不是应用徽标,当搜索视图处于展开状态时,我无法找到显示应用徽标的方法。

以下是相关部分。

清单文件

<application
    android:name="MyApp"
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
    android:logo="@drawable/app_logo"
    android:theme="@style/Theme.MyTheme" >

searchable.xml(设置图标不会改变任何内容)

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:icon="@drawable/app_logo"
    android:label="@string/app_name"
    android:hint="@string/search_hint" >
</searchable>

menu.xml文件

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu_search"
        android:actionViewClass="com.actionbarsherlock.widget.SearchView"
        android:icon="@drawable/ic_search"
        android:showAsAction="always|collapseActionView" />

活动代码

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
menu.findItem(R.id.menu_search).setActionView(searchView);

注意:我使用ABS SearchView但是当我切换到默认的SearchView时会发生同样的事情。

编辑:为了清晰起见,我添加了一些屏幕截图。

这里我使用了app徽标的星形图像和app图标的android图像。 第一个屏幕截图是活动的默认视图。 第二个是我点击搜索按钮时的视图。 它显示了android图像,而我希望它是星形图像。

enter image description here

enter image description here

9 个答案:

答案 0 :(得分:20)

将徽标drawable设置为您的图标。通过主题属性

<item name="android:icon">@drawable/ab_logo</item>

或代码

getSupportActionBar().setIcon(R.drawable.ab_logo); 

答案 1 :(得分:10)

您正在使用在menu.xml中声明的完全不同的SearchView。

使用此代码,您可以创建新的SearchView,这不是您想要的。

SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());

所以尝试创建这样的菜单。

this.getSupportMenuInflater().inflate(R.menu.menu, menu);
final SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
final MenuItem searchItem = menu.findItem(R.id.menu_search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setSearchableInfo(info);

对于ActionBar而不是setDisplayUseLogoEnabled(true)和其他,请尝试一次设置所有选项

final ActionBar bar = getSupportActionBar();
bar.setDisplayOptions(
        ActionBar.DISPLAY_SHOW_TITLE |
        ActionBar.DISPLAY_USE_LOGO |
        ActionBar.DISPLAY_SHOW_HOME |
        ActionBar.DISPLAY_HOME_AS_UP);

这是我当前项目中的设置,从未遇到过像这样的问题。

答案 2 :(得分:7)

我遇到了同样的问题,我使用以下代码解决了这个问题:

menu.findItem(R.id.menu_search).setOnActionExpandListener(this); 
// Your Activity/Fragment must implement the MenuItem.OnActionExpandListener interface

@Override
public boolean onMenuItemActionExpand(MenuItem item) {
    getSherlockActivity().getSupportActionBar().setIcon(R.drawable.uvweb_logo);
    return true;
}

让我知道这对你有用。

答案 3 :(得分:5)

我用这个简单的逻辑实现了解决方案:

public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){
        case R.id.menu_search:
            getActionBar().setIcon(R.drawable.your_logo);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

答案 4 :(得分:3)

只需从菜单Xml中删除collapseActionView即可。

答案 5 :(得分:2)

要使用徽标替换图标,请在清单文件中使用android:logo属性指定您的应用徽标,然后在您的活动中调用setDisplayUseLogoEnabled(true)

参考此document1 document2

请参阅this回答了解更多详情

答案 6 :(得分:2)

你唯一需要设置的是(在onCreate of activity中):

getSupportActionBar().setIcon(R.drawable.logo);

...不存在setLogo。

无论您将清单中的图标设置为不同的内容,这都会告诉活动在运行时使用不同的图像。

我使用以下菜单项进行了测试,结果正常:

  <menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/menu_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/search_hint"
          android:orderInCategory="1"
          android:actionViewClass="android.widget.SearchView"
          android:showAsAction="always|collapseActionView"/>

  </menu>

在onCreateOptionsMenu中正常膨胀:

getSupportMenuInflater().inflate(R.menu.search_menu, menu);

答案 7 :(得分:0)

我有同样的问题,(对于ABS)我有:

    ActionBar actionBar = ((SherlockFragmentActivity) activity).getSupportActionBar();
    actionBar.setLogo(R.drawable.logo);

我刚补充说:

actionBar.setIcon(R.drawable.logo);

问题已经消失。

答案 8 :(得分:0)

我发现解决此问题的最佳方法是以编程方式将SearchView添加到菜单中: -

    SearchView searchView = new SearchView(getActionBar().getThemedContext());
    menu.add("Search")
            .setIcon(R.drawable.ic_action_search)
            .setActionView(searchView)
            .setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
                @Override
                public boolean onMenuItemActionExpand(MenuItem item) {
                    getActionBar().setIcon(R.drawable.ic_action_willyweather);

                    return true;
                }

                @Override
                public boolean onMenuItemActionCollapse(MenuItem item) {
                    return true;
                }
            })
            .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM);

然后使用onActionExpandListener将图标/徽标更改为正确的值,然后展开SearchView。

如果您在menu.xml中定义SearchView,此解决方案也可能有效,但您仍然需要在代码中设置onActionExpandListener()以执行与上述示例相同的操作。

安迪。