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

Posted

技术标签:

【中文标题】搜索视图使用应用程序图标而不是徽标【英文标题】:Search View uses app icon instead of logo 【发布时间】:2013-05-08 18:50:53 【问题描述】:

android 文档解释说,应用程序徽标在定义时会随处使用。但是当搜索视图展开时,会使用应用图标而不是应用徽标,当搜索视图处于展开状态时,我找不到显示应用徽标的方法。

以下是相关部分。

清单文件

<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 时也会发生同样的事情。

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

在这里,我使用星形图像作为应用程序徽标,使用 android 图像作为应用程序图标。 第一个屏幕截图是活动的默认视图。 第二个是单击搜索按钮时的视图。 它显示的是 android 图像,而我希望它是明星图像。

【问题讨论】:

OP,您可能想检查 tkeunebr 的答案和相关评论。把那 1 行放在我的 onCreate 中,我/你的问题就消失了 【参考方案1】:

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

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

或在代码中

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

【讨论】:

将图标属性更改为徽标图像将更改启动器图标。这对我没有帮助。 你测试过这个吗?在哪个设备上?我在我的应用程序中使用了这个解决方案,它不会影响 Galaxy Nexus 上的启动器图标... 是的,你是对的,从样式设置图标不会影响启动器图标。仍然搜索视图显示启动器图标而不是徽标。我想你可能误解了我的问题。我将发布屏幕截图以使其清楚。 不,问题对我来说很清楚,答案应该是正确的。不久前我回答了一个类似的问题:***.com/questions/15982383/… 只需确保将图标和徽标设置为相同的可绘制对象。 确保将这个item 放在你的ActionBar 样式中,否则它会在preferences 上放一个标志。非常适合我。【参考方案2】:

您使用的是在 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);

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

【讨论】:

感谢医生的回答。我已经尝试了多种组合的答案,但输出仍然相同。您能否确认您的项目中有不同的徽标和图标资源并且可以正常工作? 啊,抱歉,我使用了相同的图标,但没有发现问题。我还发现其他一些人经历过它并且对此无能为力groups.google.com/forum/?fromgroups#!topic/android-developers/… 看起来像一个错误或未记录的东西。我尝试查看 ABS 的来源,但我找不到它设置动作视图扩展的位置,如果你能找到它,也许就是答案。为什么不能使用与此 Activity 图标相同的徽标?【参考方案3】:

我遇到了同样的问题,我用下面的代码解决了:

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;

让我知道这对你有什么作用。

【讨论】:

这行得通。调用 getActionBar().setIcon(R.drawable.uvweb_logo) 会将图标和徽标设置为相同的图像。这可能是一个可行的选择,因为 OP 似乎是从徽标开始的。您实际上不需要动作扩展侦听器。您可以在 onCreate() 中的活动级别驱动它。调用到位后,打开搜索将导致图像切换到图标,但图标现在与徽标相同。 这似乎是一个很好的解决方法,因为它不会更改任务管理器应用程序中通常首选启动器图标的图标。【参考方案4】:

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

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);
    

【讨论】:

以及我们如何在关闭搜索视图后将其删除?【参考方案5】:

只需从您的菜单 Xml 中删除 collapseActionView。

【讨论】:

【参考方案6】:

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

参考这个document1 document2

更多详情请查看this答案

【讨论】:

我已经声明了 logo 属性,我可以看到它在除 searchView 之外的任何地方都被使用。 setDisplayUseLogoEnabled(true) 也无济于事。【参考方案7】:

您唯一需要设置的是这个(在活动的 onCreate 中):

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);

【讨论】:

【参考方案8】:

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

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

我刚刚添加了:

actionBar.setIcon(R.drawable.logo);

问题就解决了。

【讨论】:

【参考方案9】:

我发现解决此问题的最佳方法是以编程方式将 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);

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

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

安迪。

【讨论】:

以上是关于搜索视图使用应用程序图标而不是徽标的主要内容,如果未能解决你的问题,请参考以下文章

从 android 上的操作栏中删除图标/徽标

Azure 身份验证器帐户图标 - 公司徽标?

移动视图中的徽标超大导航栏 |引导程序

将图标添加到 SlidingTabLayout 而不是文本

是否可以更改应用程序徽标,例如日历应用程序? [复制]

如何将图标(图像,徽标..)添加到状态栏