Android ActionBar 自定义搜索视图

45

---已解决问题- 在编辑文本中添加答案---

我在我的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);

我希望能做两件事:

  1. 更改显示在文本字段中的“搜索”文本的颜色。看起来我已经用我的主题更改了它,但我希望可以以某种方式设置单独的颜色。

  2. 打开此搜索视图时,它出现在操作栏的左侧。但我需要它在右侧。图标(放大镜)实际上位于栏的右侧,但按下它后,EditText字段会在左侧打开。我尝试使用LayoutParams,但在将其添加到ActionBar时缺少一些关键内容。

enter image description here

所以希望有人能帮助我解决这个问题。

非常感谢, Tobias

----编辑----

好的,这样就解决了一件事。通过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并折叠搜索视图到放大镜。笨拙的风格但它有效。:-)


请查看这个问题。https://dev59.com/GGYr5IYBdhLWcg3wl7LF - itsrajesh4uguys
嗯,如果我理解正确的话,他们是通过使用自己的EditText来解决这个问题。我原本希望能够简单地使用"setTextColor"的方式来解决,但看起来并不那么容易。 - Tobias Reich
好的,我解决了颜色问题。但是搜索视图的关闭仍然无法正常工作。无论如何,还是谢谢你的帮助! - Tobias Reich
尝试从视图中禁用焦点(如果您使用编辑文本)。 - itsrajesh4uguys
有趣的是,我通过使用((SearchView) searchMenuItem.getActionView()).setIconified(true);解决了这个问题。但是我必须使用两次,因为第一次会“关闭”我的文本(并显示提示),第二次才会关闭提示并显示放大镜。很奇怪,但是这样做有效...如果有更好的解决方案,请告诉我,但现在我很满意! :-) - Tobias Reich
查询提示文本旁边的图标可以自定义吗?它是灰色的,例如如何将其变为白色? - AndrewS
4个回答

29

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

1
几乎可以工作了...但是当我尝试时,内部搜索图标被复制了。我在你的gist中添加了一个带有修复代码的注释。 - kenyee
7
将此gist移植以支持appcompat。感谢ademar111190提供本地版本。 - neworld
1
@datayeah请查看上面@neworld的两条评论中的gist :) - ademar111190
1
抱歉 @ademar111190,我应该先读一下文档 ;) - dy_
1
这个类对我的目的非常有效,并且在我测试过的所有设备上都运行完美(许多API级别从15到19)。非常感谢! - Charles Madere

15

提供信息,现在通过支持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);
}

3
就是我要找的:findViewById(android.support.v7.appcompat.R.id.search_src_text) - rymo

7
我已经为EditText实现了圆角效果,代码如下:

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>

Before click search button

After click search button

<SearchView
                android:id="@+id/searchView"
                android:layout_width="match_parent"
                android:queryHint="Serach"
                android:layout_height="match_parent"></SearchView>

1
为了解决您的第二个问题,
请更改这一行:
.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 参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接