Android ActionBar 自定义搜索视图

Android ActionBar Customize Search View

提问人:Tobias Reich 提问时间:1/3/2013 最后编辑:N JTobias Reich 更新时间:9/30/2018 访问量:87543

问:

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

我正在我的 Android 应用程序中使用 Sherlock。在那里,我想展示一个. 到目前为止,它工作正常,但我意识到,我在尝试自定义它时做错了什么。ActionBarSearchView

我是这样创建的:

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,但在尝试使用 LayoutParams 将其添加到操作栏时,我缺少一些重要的东西。

enter image description here

所以希望有人能帮助我。

谢谢 托比亚斯

----编辑----

好的,有一件事已经解决了。通过 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);

在我的菜单中.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 折叠到放大镜。 笨拙的风格,但它有效。:-)

Android 自定义 ActionBarSherlock SearchView

评论

0赞 itsrajesh4uguys 1/3/2013
请看这个问题。stackoverflow.com/questions/13560438/......
0赞 Tobias Reich 1/3/2013
好吧,如果我理解正确的话,他们正在使用自己的 EditText 来解决它。我希望有一个简单的“setTextColor”方式,但似乎并不那么容易。
0赞 Tobias Reich 1/3/2013
好的,我解决了颜色问题。但是仍然有关闭 SearchView 不起作用。无论如何,感谢您的帮助!
0赞 itsrajesh4uguys 1/3/2013
尝试从视图中禁用焦点(如果您使用编辑文本)
0赞 Tobias Reich 1/3/2013
有趣的是,我通过使用 ((SearchView) searchMenuItem.getActionView()).setIconified(true) 解决了它;但是我必须使用它两次,因为第一个是“关闭”我自己的文本(并显示提示),第二个是关闭提示并显示放大镜。很奇怪,但它是这样工作的......如果有人有更好的解决方案,请告诉我,但现在,我很高兴!:-)

答:

15赞 prcaen 8/2/2013 #1

仅供参考,现在使用 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赞 rymo 12/5/2014
正是我想要的:findViewById(android.support.v7.appcompat.R.id.search_src_text)
1赞 alfred abalos 4/3/2014 #2

要解决您的第 2 个问题,请回答

更改此行:

.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |  MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

自:

.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

仅对方法使用参数SHOW_AS_ACTION_IF_ROOMsetShowAsAction()

29赞 ademar111190 6/5/2014 #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);

评论

1赞 kenyee 6/6/2014
差不多了......当我尝试时复制了内部搜索图标。我在您的要点中添加了带有固定代码的评论。
7赞 neworld 8/27/2014
移植此要点以支持 appcompat。感谢 ademar111190 提供本机版本。
1赞 ademar111190 10/1/2014
@datayeah看到上面@neworld两条评论的要点:)
1赞 dy_ 10/2/2014
对不起@ademar111190,我应该有RTFC;)
1赞 Charles Madere 10/2/2014
这个类非常适合我的目的,并且在我测试过的所有设备上都能完美运行(许多 API 级别从 15 一直到 19)。谢谢一堆!
7赞 Naveen Kumar M 6/9/2016 #4

我像这样为编辑文本做了圆角。

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>