安卓搜索栏图标

30
我希望禁用搜索视图组件内显示的Mag图标。有没有想法如何引用并删除它或将其替换为另一个可绘制对象?

enter image description here


4
为什么有人会对这个问题点踩呢? - Harsha M V
搜索视图图标下面的白线怎么办 - 如何自定义它? - AndrewS
你最终解决了这个问题吗? - theblang
@mattblang 是的,请发送电子邮件给我,我会尽力获取代码并分享。 - Harsha M V
10个回答

15

既然问题的措辞没有提到 ActionBarSherlock(除了标签之外),并且已经有评论表示接受的答案不适用于标准和/或支持库操作栏,因此我发布了另一个答案。以下是 onCreate 的 Java 代码:

// obtain action bar
ActionBar actionBar = getSupportActionBar();

// find SearchView (im my case it's in a custom layout because of left alignment)
View v = actionBar.getCustomView();
SearchView searchView = (SearchView)v.findViewById(R.id.search_view);
ImageView icon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);

// method 1: does not work persistently, because the next line
// should be probably called after every manipulation with SearchView
// icon.setVisibility(View.GONE);

// method 2: working code
icon.setAdjustViewBounds(true);
icon.setMaxWidth(0);
icon.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
icon.setImageDrawable(null);
根据这篇文章,使用支持库中的SearchView(在我的情况下是android-support-v7-appcompat)并且调用setIconifiedByDefault(false)时,图标会显示在编辑文本框(SearchAutoComplete)之外。相反地,如果调用setIconifiedByDefault(true)则图标会显示在文本框内部。所提供的代码用于默认禁用"图标化"功能,并且可能需要一些更改才能与"图标化"搜索视图配合使用。我不知道是否适用于ActionBarSherlock

希望这有所帮助。


我正在使用AppCompat SearchView,但是我无法让文本框内的图标消失。你有其他的想法吗? - AndrewS
你应该检查一下你的库是哪个版本,并查看它的源代码,特别是布局文件。例如,如果你查看这个Android源代码,你会发现search_mag_iconsearch_plate之外。通过源代码,你可以推断出在你的布局中需要“查找”的元素。 - Stan
嗯,我昨天也更新了库,上面的代码对我有效。我想你的项目可能有其他特定问题。你能否发布一些代码并详细解释出了什么问题,或许在一个单独的问题中? - Stan
我用你给的方法尝试修改搜索图标: icon.setImageResource(R.drawable.ic_action_remove);
  • 但没有效果。我创建了一个包含代码细节的新问题,请帮忙解决,谢谢。
- AndrewS
1
@Andrew,没有,我没有。 - Stan
显示剩余2条评论

7

这个图标是提示。因此,你可以简单地设置新的提示文本。

int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
    EditText searchPlate = (EditText) searchView.findViewById(searchPlateId);

    searchPlate.setHint("Search");

如果您想将图标用作提示文本,请使用带有ImageSpan的SpannableString。
int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
    EditText searchPlate = (EditText) searchView.findViewById(searchPlateId);


    searchPlate.setTextColor(getResources().getColor(R.color.search_text_color));
    SpannableString string = new SpannableString(" ");
    Drawable d = getResources().getDrawable(R.drawable.ic_search);
    d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
    ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM);
    string.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    searchPlate.setHint(string);

4

在您的主题中:

<style name="Theme" parent="Your parent theme">
<item name="android:searchViewSearchIcon">@android:drawable/ic_search</item>
</style>

编辑:
searchViewSearchIcon 是一个私有属性。因此,这个答案在原生的 ActionBar 上不起作用。


3
将其设置为@android:color/transparent以删除它,或者将其更改为您想要的颜色。 - Mattias Isegran Bergander
2
哇塞,太棒了。非常感谢。我不需要再发布关于操作栏样式的问题了:D。 - Harsha M V
1
嗨@Ahmad,我正在使用<style name="AppBaseTheme" parent="android:Theme.Holo"> <item name="android:searchViewSearchIcon">@ android:color / transparent </ item>
</style>但是它给我“找不到与给定名称匹配的资源:attr'android:searchViewSearchIcon'”
- Himanshu
34
android:searchViewSearchIcon 是私有的。这个答案完全不起作用。 - Kyle Ivey
1
这对我来说可用,适用于2.3到4.4版本的ABC。谢谢! - Philio
显示剩余6条评论

3
您需要在菜单项中添加以下行:android:iconifiedByDefault="@android:color/transparent"
<item
    android:id="@+id/activity_home_action_search"
    android:icon="@drawable/ic_action_search"
    android:title="@string/activity_home_search_title"
    android:iconifiedByDefault="@android:color/transparent"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView" />

或者您可以通过编程方式实现searchView.setIconifiedByDefault(true);

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    getMenuInflater().inflate(R.menu.home, menu);

    MenuItem searchMenuItem = menu.findItem(R.id.activity_home_action_search);

    SearchView searchView = (SearchView) searchMenuItem.getActionView();
    searchView.setIconifiedByDefault(true);
}

2
要移除提示搜索按钮:
mNearMeSearchBar = (SearchView) mView.findViewById(R.id.nearme_search_component_nearme_edittext);
mNearMeSearchBar.setIconifiedByDefault(false); //Removes Search Hint Icon

更改搜索按钮的可绘制项:

int searchImgId = getResources().getIdentifier("android:id/search_mag_icon", null, null);
ImageView v = (ImageView) mNearMeSearchBar.findViewById(searchImgId);
v.setImageResource(R.drawable.ic_compass);

2

您需要自定义SearchView的样式,如下所示:

<style name="MySearchViewStyle" parent="Widget.AppCompat.SearchView">
    <!-- Search button icon -->
    <item name="searchIcon">@drawable/ic_arrow_back</item>
</style>

然后将它添加到你的AppTheme中。
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!--   your other colors and styles -->
    <item name="searchViewStyle">@style/MySearchViewStyle</item>
</style>

然后使用标签style将其应用于您的搜索视图:

<android.support.v7.widget.SearchView
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/searchView"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            app:queryHint="@string/search_hint"
            android:focusable="true"
            android:focusableInTouchMode="true"
            style="@style/MySearchViewStyle"
            app:iconifiedByDefault="false" />

希望这有所帮助!

1
这些代码移除了放大镜:

    //remove search icon
    mSearchView.setIconifiedByDefault(false);
    ImageView icon = (ImageView) mSearchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
    icon.setVisibility(View.GONE);

1
如果您正在使用v7应用兼容库,您可以在主题中轻松更改此设置。只需在从AppCompat主题扩展的主题中添加一行如下的代码:
<item name="searchViewSearchIcon">@drawable/ic_search</item>

0
在xml中的searchView组件中添加以下内容:
app:searchHintIcon="@null"

0
在您的主题样式中包含以下内容:
<style name="YourTheme.Toolbar">
    <item name="searchViewStyle">@style/YourActionBarSearch</item>
    <item name="editTextColor">@color/your_ab_text_color</item>
    <item name="android:textColorHint">@color/your_ab_hint_color</item>
</style>

现在您可以使用searchViewStyle定义SearchView的样式,editTextColor将设置搜索框中文本的颜色。通过设置android:textColorHint,您还可以设置提示的颜色,例如“搜索...”。
<style name="YourActionBarSearch" parent="@style/Widget.Holo.SearchView">
    <item name="searchIcon">@drawable/ic_ab_search</item>
    <item name="queryBackground">@null</item>
    <item name="submitBackground">@null</item>
    <item name="searchHintIcon">@null</item>
    <item name="defaultQueryHint">@null</item>
    <item name="closeIcon">@drawable/ic_ab_small_search_close</item>
</style>

这将按照您的喜好为搜索视图设置样式。字段searchIcon是操作栏中的图标。字段searchHintIcon是搜索字段提示左侧的小图标,这就是你在问题中询问的;将其设置为@null以移除该图标。字段closeIcon是搜索字段右侧的关闭图标。


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