在Android操作栏中设置SearchView的样式

36

我在我的操作栏中有一个搜索小部件,就像这样:

Search Widget in Action Bar

(1) 我该如何更改“iPhone”文本的颜色?

(2) 另外,如果你注意到灰色的X - 当它处于图标位置时,整个搜索小部件也是那种颜色。我使用的是Holo.Theme.Light并对其进行了自己的修改。

我该如何在styles.xml文件中更改这两个小部件的样式(假设这是更改搜索小部件的地方)?


  1. “在图标位置”是什么意思?
  2. 在第二个问题中,你真正想要改变的是什么?X的颜色?下划线的颜色?还是两者都要改变?
- vArDo
嘿,这已经是老问题了,但我还是解决了它——在某种程度上。我将答案放在下面。我主要想改变文本和X的颜色。在一个图标位置,只有放大镜在操作栏中。你点击它,就像你在上面看到的那样打开它。 - TheLettuceMaster
1
这是一个不太正规的方法,但它能够工作。 - Pongpat
@KickingLettuce 请问您是否使用自定义的ActionBar布局?您是如何在左侧显示图标图片的呢? - Erum
终于成功了!!在Xamarin.Android上完美运行。@Pongpat感谢你。 - KennyAli
11个回答

50

我为此花费了很多时间,但最终做到了::-)

  1. 要更改文本颜色:
((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)).setTextColor(Color.WHITE);

或者使用这个适用于 AndroidX 的方法:

((EditText)searchView.findViewById(androidx.appcompat.R.id.search_src_text)).setTextColor(Color.WHITE);
  1. 更改文本提示:
((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)).setHintTextColor(Color.WHITE);

或者针对AndroidX使用以下内容:

((EditText)searchView.findViewById(androidx.appcompat.R.id.search_src_text)).setHintTextColor(Color.WHITE);

15

如果你正在使用appcompat库,那么解决方案与Jerome的答案有些不同。这是我的解决方案。

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    getMenuInflater().inflate(R.menu.main_menu, menu);
    restoreActionBar();

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    searchAutoComplete.setHintTextColor(Color.WHITE);
    searchAutoComplete.setTextColor(Color.WHITE);

    View searchplate = (View)searchView.findViewById(android.support.v7.appcompat.R.id.search_plate);
    searchplate.setBackgroundResource(R.drawable.texfield_searchview_holo_light);

    ImageView searchCloseIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
    searchCloseIcon.setImageResource(R.drawable.clear_search);

    ImageView voiceIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_voice_btn);
    voiceIcon.setImageResource(R.drawable.abc_ic_voice_search);

    ImageView searchIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
    searchIcon.setImageResource(R.drawable.abc_ic_search);


    return super.onCreateOptionsMenu(menu);
}

2
我们很懒,不喜欢跟随链接。请在您的答案中包含解决方案,而不仅仅是一个链接。 - mhlester
大部分内容来自于appcompat中的abc_search_view.xml文件。希望对某些人有所帮助。 - LEO
正是我所需要的。 - theblang
你能够真正改变 search_mag_icon 吗?我可以改变除了那个之外的所有东西。 - theblang

13

您可以更改搜索视图的样式。这里是一些代码,我用它来微调EditText、语音图标...

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
        searchView.findViewById(searchPlateId).setBackgroundResource(R.drawable.textfield_search_selected);

        int voiceSearchPlateId = searchView.getContext().getResources().getIdentifier("android:id/submit_area", null, null);
        searchView.findViewById(voiceSearchPlateId).setBackgroundResource(R.drawable.textfield_search_right_selected);

        // change hint color
        int searchTextViewId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView searchTextView = (TextView) searchView.findViewById(searchTextViewId);
        searchTextView.setHintTextColor(getResources().getColor(R.color.light_grey));

[编辑]这里有一个更完整的答案: 更改搜索视图小部件的背景可绘制项


我该如何找到这些ID?我想将放大镜图标和“x”更改为深色。 - Victor Basso
+1。这对我很有帮助。但是,除了使用getIdentifier之外,在ABS的情况下,您也可以直接使用ids。searchView.findViewById(R.id.abs__search_plate).setBackgroundResource(R.drawable.myBackground);同样,您也可以用于提交区域和搜索src文本。 - Rahul Sainani

9
从博客文章http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html中可以看到,从Lollipop开始,您可以像这样为搜索视图设置样式。
values/themes.xml:
<style name=”Theme.MyTheme” parent=”Theme.AppCompat”>
    <item name=”searchViewStyle”>@style/MySearchViewStyle</item>
</style>
<style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”>
    <!-- Background for the search query section (e.g. EditText) -->
    <item name="queryBackground">...</item>
    <!-- Background for the actions section (e.g. voice, submit) -->
    <item name="submitBackground">...</item>
    <!-- Close button icon -->
    <item name="closeIcon">...</item>
    <!-- Search button icon -->
    <item name="searchIcon">...</item>
    <!-- Go/commit button icon -->
    <item name="goIcon">...</item>
    <!-- Voice search button icon -->
    <item name="voiceIcon">...</item>
    <!-- Commit icon shown in the query suggestion row -->
    <item name="commitIcon">...</item>
    <!-- Layout for query suggestion rows -->
    <item name="suggestionRowLayout">...</item>
</style>

有没有办法在早期版本的Android中使用搜索视图的样式?例如像KitKat那样? - Red M
这是AppCompat - 确实适用于Lollipop之前的设备。 - PrzemekTom

9
您需要设置:
searchView.setBackgroundColor(Color.WHITE);

搜索视图的自定义程度较低。


非常有趣,需要尝试一下。几周前我用一个解决方法解决了这个问题...但是这个很好知道。点赞。 - TheLettuceMaster

4
SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search));
searchView.setSubmitButtonEnabled(true); // to enable submit button

ImageView b = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_go_btn);
b.setImageResource(android.R.drawable.ic_menu_search); //to change submit button icon

TextView a=(TextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
a.setTextColor(...); //to change color of search text

3

我解决这个问题的方法是使用Holo.Light.DarkActionBar主题。否则,我认为您不会轻易更改搜索小部件。


3
实际上,您可以在SearchView中设置EditText的文本颜色。然而,正如您所提到的,它不像使用XML样式定义那么容易。您甚至可以设置下划线的颜色。查看我的回答以获取有关SearchView自定义的更多信息。我的答案 - vArDo
1
这是我认为最好的方法。 - Clive Jefferies

2

onCreateOptionsMenu : 中:

int id = searchView.getContext()
                   .getResources()
                   .getIdentifier("android:id/search_src_text", null, null);
    TextView textView = (TextView) searchView.findViewById(id);
    textView.setTextColor(Color.WHITE);

0
@Override
    public boolean onCreateOptionsMenu(Menu menu) {

        super.onCreateOptionsMenu(menu);

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);

        // Associate search configuration with the SearchView
        SearchManager searchManager =
               (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setQueryHint("Client/DOB/PPSN");
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));

        // Setting the textview default behaviour properties
        int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView textView = (TextView) searchView.findViewById(id);
        textView.setTextColor(Color.WHITE);
        textView.setHintTextColor(Color.WHITE);

        // Set the search plate color to white
        int linlayId = getResources().getIdentifier("android:id/search_plate", null, null);
        View view = searchView.findViewById(linlayId);
        Drawable drawColor = getResources().getDrawable(R.drawable.searchcolor);
        view.setBackground( drawColor );
        return super.onCreateOptionsMenu(menu);

    }

现在这是用于更改搜索栏背景颜色的xml文件searchcolor.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
      <shape >
          <solid android:color="#ffffff" />
      </shape>
  </item>

  <!-- main color -->
  <item android:bottom="1.5dp"
      android:left="1.5dp"
      android:right="1.5dp">
      <shape >
          <solid android:color="#2c4d8e" />
      </shape>
  </item>

  <!-- draw another block to cut-off the left and right bars -->
  <item android:bottom="10.0dp">
      <shape >
          <solid android:color="#2c4d8e" />
      </shape>
  </item>
</layer-list>

同时还需要 menu/menu.xml 文件来在操作栏中创建搜索功能

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/search"
          android:icon="@drawable/search"
          android:showAsAction="ifRoom"
          android:actionViewClass="android.widget.SearchView" />

</menu>

0

在你的xxxActivity.java文件中获取SearchView,然后:

SearchView searchView = (SearchView)menu.findItem(R.id.my_search_view).getActionView();
int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);

// Getting the 'search_plate' LinearLayout.
View searchPlate = searchView.findViewById(searchPlateId);
searchPlate.setBackgroundResource(R.drawable.textfield_searchview);

创建文件 res/drawable/texfield_searchview.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true"
        android:drawable="@drawable/textfield_search_selected_holo_light" />
    <item android:drawable="@drawable/textfield_search_default_holo_light" />
</selector>

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