在安卓中实现可点击的自定义SearchView

27

我的应用中有一个SearchView小部件,我想询问一些关于如何自定义它的问题。首先,你只能通过点击搜索图标开始搜索,有没有办法使整个SearchView可点击?此外,是否有办法在点击SearchView时让它显示类似于这样的东西:

繁忙的猫

它现在处于这种状态:

繁忙的猫

这是我的代码:

citySearch = (SearchView) findViewById(R.id.city_search_bar);
citySearch.setBackgroundResource(R.drawable.search_background);
citySearch.setOnSearchClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        citySearch.setIconifiedByDefault(true);
        //citySearch.setIconified(true);
    }

});
citySearch.setOnQueryTextListener(new OnQueryTextListener() {

    @Override
    public boolean onQueryTextChange(String text) {

        ((Filterable) cityListView.getAdapter()).getFilter().filter(text);

        return false;
    }

    @Override
    public boolean onQueryTextSubmit(String text) {

        return false;
    }

});

try
{
    Field searchField = SearchView.class.getDeclaredField("mSearchButton");
    searchField.setAccessible(true);
    ImageView searchBtn = (ImageView)searchField.get(citySearch);
    searchBtn.setImageResource(R.drawable.search_icon);
    searchBtn.setScaleType(ScaleType.FIT_CENTER);
    searchPlate.setBackgroundResource(R.drawable.search_background);
}
catch (NoSuchFieldException e)
{
    Log.e("SEARCHSTYLEERROR",e.getMessage(),e);
}
catch (IllegalAccessException e)
{
    Log.e("SEARCHSTYLEERROR",e.getMessage(),e);
}

1
好的,第一个问题已经解决,使用citySearch的setOnClickListener方法。 - Anhayt Ananun
你应该在评论中回答这个问题...它解决了我的问题。 - coder
@AnhaytAnanun,你现在解决了这些问题吗?如果是的话,解决方案是什么?能否请你分享一下解决方案...这可能也会对我们有所帮助。 - Muralidharan Kathiresan
@AnhaytAnanun请勾选答案,它是正确的。 - the_prole
5个回答

52

默认情况下,SearchView是“iconified”,以放大镜图标显示,只有用户点击该图标,编辑字段才会展开。

为了使用户可以在SearchView上的任何位置点击并展开输入字段。我们只需要添加一个单击监听器,并在用户单击时调用setIconified(false)。

searchView = (SearchView)findViewById(R.id.searchView);
searchView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            searchView.setIconified(false);
        }
    });

5
默认情况下,SearchView 是“缩小”的。因此,在 Java 中应使用以下代码:
SearchView searchView = (SearchView) findViewById(R.id.searchView);
searchView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        searchView.setIconified(false);
    }
});

或者在xml中使用这个:
<SearchView
        android:id="@+id/searchView"
        android:iconifiedByDefault="false" />

这两种方式都是正确的,但在图标显示方面有所不同。

4

另一种简单的方法是通过设置onActionViewExpanded()

searchView = (SearchView)findViewById(R.id.searchView);
searchView.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        searchView.onActionViewExpanded();
    }
});

3
为了使整个组件都能够点击并进行编辑,我建议您在xml文件中声明iconifiedByDefault="false"
<SearchView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:iconifiedByDefault="false"/>

这就是我在寻找的答案。我只需要在布局中添加 android:focusableInTouchMode="true" 就可以消除Searchview的初始焦点。 - Petr Kramolis

0

您可以在代码的任何地方使用此代码:searchView.setIconifiedByDefault(false);

来自Android SDK:

当SearchView作为可折叠菜单项的操作视图在ActionBar中使用时,需要使用setIconifiedByDefault(true)将其默认设置为图标化。这是默认设置,因此无需执行任何操作。

如果希望始终显示搜索字段,请调用setIconifiedByDefault(false)。


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