搜索视图使用应用程序图标而不是徽标
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() 以执行与上述示例相同的操作。
安迪。
【讨论】:
以上是关于搜索视图使用应用程序图标而不是徽标的主要内容,如果未能解决你的问题,请参考以下文章