Android ActionBar自定义search视图

—解决了问题 – 在编辑文本中添加了答案—

我在我的Android应用程序中使用了ActionBar Sherlock。 在那里我想显示一个SearchView 。 它迄今为止工作得很好,但我意识到,我试图定制它时做错了什么。

我这样创build它:

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

我想做两件事情:

  1. 更改出现的文本字段中显示的文本“search”的颜色。 它看起来像我的主题中的整体文字样式,但我希望我可以设置一个单独的颜色。

  2. 当打开这个search查看时,它会出现在操作栏的左侧。 但我需要在右边。 图标(放大镜)实际上是在酒吧的右侧,但按下它打开左侧的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); 

并在我的菜单

 <item android:id="@+id/action_search" android:title="Search" android:icon="@drawable/ic_action_search" android:showAsAction="always" android:actionViewClass="com.actionbarsherlock.widget.SearchView" /> 

所以至less有一个神秘的解决(为什么这有所作为)。 但新创build的XML在调用时不再closures

 searchMenuItem.collapseActionView(); 

所以还是有问题的

—编辑2 —

只是让你知道。 我find了文字颜色的解决scheme。 它可以通过使用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在提交文本时不再closures。 所以collapseActionView()等不起作用。 有任何想法吗?

—编辑3 —

好的,我find了一个解决scheme。 我不知道这是否是正确的方式做到这一点,但使用时

 ((SearchView) searchMenuItem.getActionView()).setIconified(true); 

它closures了EditText

我必须做两次,因为第一次只是“删除”我的input文本,并显示“提示”,而第二次使用是“closures”提示EditText并折叠searchView到放大镜。 笨拙的风格,但它的作品。 🙂

我做了一个类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); 

FYI现在用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); } 

我这样做了编辑文本的圆angular。

 int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null); View searchPlate = 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_width="match_parent" android:queryHint="Serach" android:layout_height="match_parent"></SearchView> 

解决你的第二个问题

改变这一行:

 .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参数