首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Android更改SearchView中的SearchView

使用Android更改SearchView中的SearchView
EN

Stack Overflow用户
提问于 2014-11-26 18:43:55
回答 4查看 18.4K关注 0票数 14

我有以下问题。我已经将我的Actionbar设置为使用工具栏,而不是在appcompat-v7:21中使用API 21。textColorPrimary样式标记被配置为使用颜色@android:color/white,因此新的Android中的所有标题都将具有白色文本颜色(到目前为止还不错)。

现在,我添加了一个SearchView,并为它设置了一个自定义背景,如下所示:

代码语言:javascript
复制
<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/action_bar_background</item>
    <item name="colorPrimaryDark">@color/status_background</item>
    <item name="android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:textColorPrimary">@android:color/white</item>
    <item name="searchViewStyle">@style/SearchViewStyle</item>
</style>

<style name="SearchViewStyle" parent="Widget.AppCompat.SearchView">
    <item name="queryBackground">@drawable/search_background</item>
    <item name="searchIcon">@drawable/icon_search</item>
</style>

可绘制的@drawable/search_background是一个普通的白色矩形。你猜怎么着?由于工具栏中的标题文本颜色是白色的,现在SearchView中的文本颜色也是白色的,而且由于SearchView背景是白色矩形,用户无法看到他正在键入什么。

我的问题是:如何为Android标题和SearchView文本设置不同的文本颜色?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-26 18:43:55

经过一番研究,我找到了一个安全的方法。

在SearchView样式中,我发现了用于显示SearchView的布局。在该布局中有一个TextView (输入SearchView的实际字段)

代码语言:javascript
复制
<TextView
        android:id="@+id/search_badge"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:layout_marginBottom="2dip"
        android:drawablePadding="0dip"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="?android:attr/textColorPrimary"
        android:visibility="gone" />

注意android:textColor="?android:attr/textColorPrimary"字段。这导致了我最初遇到的问题,SearchView中的文本颜色与Android中为标题文本颜色定义的颜色相同。

现在有几种解决方案可以使用here,但我认为大多数解决方案都有相同的问题。它们都依赖于TextView的id来访问视图和更改文本颜色,如here所描述的那样。

就我个人而言,我认为在代码中硬编码TextView的id是非常危险的,因为我们不知道谷歌明天是否决定为这个视图使用另一个id值,在这种情况下,我们的代码将被破坏。

为此,我创建了一个递归方法,它在TextView中获取SearchView对象,并将颜色更改为我们想要的任何颜色。

代码语言:javascript
复制
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.search, menu);
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();

    searchView.setOnQueryTextListener(new SearchTextListener());
    changeSearchViewTextColor(searchView);
}


private void changeSearchViewTextColor(View view) {
    if (view != null) {
        if (view instanceof TextView) {
            ((TextView) view).setTextColor(Color.BLACK);
            return;
        } else if (view instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup) view;
            for (int i = 0; i < viewGroup.getChildCount(); i++) {
                changeSearchViewTextColor(viewGroup.getChildAt(i));
            }
        }
    }
}

我在工具栏上使用API 21测试了这段代码,将工具栏标题文本颜色设置为白色,并将SearchView文本颜色设置为黑色,它工作得非常完美。另外,当我们直接访问TextView对象时,我们可以更改提示、可绘制、填充以及与TextView相关的所有内容。

票数 30
EN

Stack Overflow用户

发布于 2016-03-18 20:28:25

这完全可以在XML中使用ThemeOverlay来完成。

代码语言:javascript
复制
<style name="ThemeOverlay.MyApp.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="autoCompleteTextViewStyle">@style/Widget.MyApp.AutoCompleteTextView.SearchView</item>
    <item name="searchViewStyle">@style/Widget.MyApp.SearchView</item>
</style>

<style name="Widget.MyApp.AutoCompleteTextView.SearchView" parent="Widget.AppCompat.AutoCompleteTextView">
    <item name="android:textColor">#000</item>
    <item name="android:textColorHint">#5000</item>
</style>

<style name="Widget.MyApp.SearchView" parent="Widget.AppCompat.SearchView">
    <item name="queryBackground">@drawable/search_background</item>
    <item name="searchIcon">@drawable/icon_search</item>
</style>

然后在布局文件中:

代码语言:javascript
复制
<android.support.v7.widget.Toolbar
    app:theme="@style/ThemeOverlay.MyApp.ActionBar"
    ... />

如果还希望它应用于使用ActionBar而不是ToolBar的活动,则可以将其添加到Activity的主题中:

代码语言:javascript
复制
<style name="Theme.MyApp" parent="Theme.AppCompat">
    <item name="actionBarTheme">@style/ThemeOverlay.MyApp.ActionBar</item>
    ...
</style>
票数 6
EN

Stack Overflow用户

发布于 2014-12-19 13:17:08

@David_E的解决方案是可行的,但还有另外一种方法。还可以定义自定义布局:

代码语言:javascript
复制
<style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”>
    <item name="layout">@layout/my_Search_view</item>
</style>

然后,您可以接受默认布局文件,您可以通过名称:abc_search_view.xml找到该文件,由搜索视图使用,并对其进行修改。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27156680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档