Android ActionBar 自定义搜索视图
Posted
技术标签:
【中文标题】Android ActionBar 自定义搜索视图【英文标题】:Android ActionBar Customize Search View 【发布时间】:2012-12-17 17:03:47 【问题描述】:--- 解决了问题 - 在编辑文本中添加了答案 ---
我在我的 android 应用程序中使用 ActionBar
Sherlock。在那里我想显示一个SearchView
。
到目前为止它运行良好,但我意识到,在尝试自定义它时我做错了。
我是这样创建的:
searchView.setQueryHint("Search: ");
searchView.setOnQueryTextListener(this);
searchView.setOnCloseListener(...);
searchMenuItem = menu.add("Search place");
searchMenuItem.setIcon(R.drawable.ic_action_search)
.setActionView(searchView)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
我想做两件事:
更改显示在出现的文本字段中的文本“搜索”的颜色。看起来我用主题中的整体文本样式更改了它,但我希望我能以某种方式设置单独的颜色。
打开此搜索视图时,它会出现在操作栏的左侧。但我需要它在右侧。图标(放大镜)实际上位于栏的右侧,但按下它会打开左侧的 EditTextfield。我尝试使用 LayoutParams,但在尝试使用 LayoutParams 将其添加到操作栏时,我遗漏了一些重要的东西。
所以希望有人可以帮助我。
非常感谢, 托比亚斯
---- 编辑----
好的,一件事已经解决了。通过 XML 添加 ActionBar 会使 TextEdit 向右。
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
Log.e(TAG, "searchView: " + searchView);
在我的 menu.xml 中
<item android:id="@+id/action_search"
android:title="Search"
android:icon="@drawable/ic_action_search"
android:showAsAction="always"
android:actionViewClass="com.actionbarsherlock.widget.SearchView" />
所以至少解决了一个谜团(为什么这会有所作为)。但是新创建的 XML 在调用时不再关闭
searchMenuItem.collapseActionView();
所以还是有问题。
--- 编辑 2 ---
只是为了让你知道。我找到了文本颜色的解决方案。可以通过使用SearchView的AutoCompleteTextView来实现:
AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
searchText.setHintTextColor(getResources().getColor(R.color.white));
searchText.setTextColor(getResources().getColor(R.color.white));
所以我遇到的最后一个问题是 SearchView 在提交文本时不再关闭。所以 collapseActionView() 等不起作用。有什么想法吗?
--- 编辑 3 ---
好的,我找到了解决方案。我不知道这是否是正确的方法,但是在使用时
((SearchView) searchMenuItem.getActionView()).setIconified(true);
它关闭EditText
我必须这样做两次,因为第一次只是“删除”我的输入文本并显示“提示”,而第二次使用是“关闭”提示 EditText 并将 searchView 折叠到放大镜。 笨拙的风格,但它的作品。 :-)
【问题讨论】:
请看看这个问题。 ***.com/questions/13560438/… 好吧,如果我理解这一点,他们正在通过使用自己的 EditText 来解决它。我希望有一个简单的“setTextColor”方式,但似乎并不那么容易。 好的,我解决了颜色问题。但是仍然有关闭 SearchView 不起作用。无论如何感谢您的帮助! 尝试从视图中禁用焦点(如果您使用编辑文本) 很有趣,我通过使用 ((SearchView) searchMenuItem.getActionView()).setIconified(true);但是我必须使用它两次,因为第一个是“关闭”我自己的文本(并显示提示),第二个是关闭提示并显示放大镜。很奇怪,但它是这样工作的......如果有人有更好的解决方案,请告诉我,但现在,我很高兴! :-) 【参考方案1】:我为这样的编辑文本做了圆角。
int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
View searchPlate = searchView.findViewById(searchPlateId);
searchPlate.setBackgroundResource(R.drawable.bg_white_rounded);
int searchSrcTextId = getResources().getIdentifier("android:id/search_src_text", null, null);
EditText searchEditText = (EditText) searchView.findViewById(searchSrcTextId);
searchEditText.setTextColor(Color.BLACK);
searchEditText.setHintTextColor(Color.LTGRAY);
int closeButtonId = searchView.getContext().getResources().getIdentifier("android:id/search_close_btn", null, null);
ImageView closeButtonImage = (ImageView) searchView.findViewById(closeButtonId);
closeButtonImage.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
bg_white_background.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff"/>
<corners android:radius="8dp"/>
</shape>
<SearchView
android:id="@+id/searchView"
android:layout_
android:queryHint="Serach"
android:layout_></SearchView>
【讨论】:
【参考方案2】:解决您的第二个问题
改变这一行:
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
收件人:
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
在setShowAsAction()
方法上仅使用SHOW_AS_ACTION_IF_ROOM
参数
【讨论】:
【参考方案3】:我做了一个课程SearchViewFormatter 来轻松格式化原生 SearchView android 小部件。一个例子:
new SearchViewFormatter()
.setSearchBackGroundResource(R.drawable.my_bg)
.setSearchIconResource(R.drawable.my_ic, true, false) //true to icon inside edittext, false to outside
.setSearchVoiceIconResource(R.drawable.my_ic)
.setSearchTextColorResource(R.color.my_color)
.setSearchHintColorResource(R.color.my_color)
.setSearchCloseIconResource(R.drawable.my_ic)
.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)
.format(mSearchView);
【讨论】:
几乎可以工作...当我尝试时复制了内部搜索图标。我在您的要点中添加了一条带有固定代码的评论。 移植了这个gist to support appcompat。感谢 ademar111190 提供原生版本。 @datayeah 见上面@neworld 两个cmets 的gist :) 对不起@ademar111190,我应该有 rtfc ;) 这个类非常适合我的目的,并且在我测试过的所有设备上都能完美运行(许多 API 级别从 15 一直到 19)。非常感谢!【参考方案4】:仅供参考,现在 ActionBar 支持 v7 appcompat 更改查询提示颜色、文本颜色、文本大小的方式:
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.SearchAutoComplete;
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.menu_home, menu);
MenuItem searchItem = menu.findItem(R.id.item_search);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
mSearchView.setOnQueryTextListener(this);
mSearchView.setQueryHint(getString(R.string.text));
SearchAutoComplete searchAutoComplete = (SearchAutoComplete) mSearchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchAutoComplete.setHintTextColor(mRes.getColor(android.R.color.white));
searchAutoComplete.setTextSize(14);
return super.onCreateOptionsMenu(menu);
【讨论】:
正是我想要的:findViewById(android.support.v7.appcompat.R.id.search_src_text)
以上是关于Android ActionBar 自定义搜索视图的主要内容,如果未能解决你的问题,请参考以下文章
ActionBar - 具有居中 ImageView 的自定义视图,两侧的操作项