如何捕获SearchView的清除按钮单击?


71

我如何捕获用户单击明文的事件,方法SearchView是单击右侧的X按钮

我已经捕获了onQueryTextChange事件,但这是针对所有文本更改的,而不是针对该X按钮的


我也在寻找这个问题的答案。任何人都有链接,因为我在Google上搜索了过去几个小时,却找不到任何东西。
Sitram

Answers:


110

尝试了多种组合之后,我发现了如何捕获SearchView中X按钮后面的事件

以下是onCreateOptionsMenu我的一个应用程序中的功能的代码段。mSearchMenumSearchView是全局变量。X实际上是具有ID的ImageView,search_close_btn文本区域是具有ID的EditText视图search_src_text

@SuppressLint("NewApi")
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.country_list_activity_actions, menu);
        mSearchMenu = menu.findItem(R.id.action_search);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // Get the SearchView and set the searchable configuration
            SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

            // Assumes current activity is the searchable activity
            mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
            mSearchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default

            // Get the search close button image view
            ImageView closeButton = (ImageView)mSearchView.findViewById(R.id.search_close_btn);

            // Set on click listener
            closeButton.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    LoggerUtils.d(LOG, "Search close button clicked");
                    //Find EditText view
                    EditText et = (EditText) findViewById(R.id.search_src_text);

                    //Clear the text from EditText view
                    et.setText("");

                    //Clear query
                    mSearchView.setQuery("", false);
                    //Collapse the action view
                    mSearchView.onActionViewCollapsed();
                    //Collapse the search widget
                    mSearchMenu.collapseActionView();
                }
            });
        }

        // When using the support library, the setOnActionExpandListener() method is
        // static and accepts the MenuItem object as an argument
        mSearchMenu.setOnActionExpandListener(new OnActionExpandListener() {

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                //Nothing to do here
                LoggerUtils.d(LOG, "Search widget expand ");
                return true; // Return true to expand action view
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                LoggerUtils.d(LOG, "Search widget colapsed ");
                return true; // Return true to collapse action view
            }
        });

        return super.onCreateOptionsMenu(menu);
    }

我在这里有一个类似的问题: stackoverflow.com/questions/43702055/…。mSearchView.onActionViewExpanded()不起作用。您对我该如何解决有任何想法或想法?
AJW

很有帮助。谢谢。
Pooja,

55

您可以只使用onCloseListener()

sv= (SearchView) findViewById(R.id.searchView1);

sv.setOnCloseListener(new OnCloseListener() {
            @Override
            public boolean onClose() {
                Toast t = Toast.makeText(MainActivity.this, "close", Toast.LENGTH_SHORT);
                t.show();

                return false;
            }
        });

我看不到任何不工作的原因。除非stackoverflow.com/a/14622049/4127670
spaceMonkey 2015年

31
也许这在崩溃中起作用SearchView,但对我而言不起作用iconifiedByDefault="false"
Richard Le Mesurier

34

我在尝试通过其ID查找组件时遇到问题,但是我找到了另一种使用相同SearchView上下文搜索该组件的方法

// Catch event on [x] button inside search view
int searchCloseButtonId = searchView.getContext().getResources()
                .getIdentifier("android:id/search_close_btn", null, null);
ImageView closeButton = (ImageView) this.searchView.findViewById(searchCloseButtonId);
// Set on click listener
closeButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       // Manage this event.
    }
});

3
它有效,只是别忘了添加searchView.setIconified(true);searchView.setIconified(false);相应地添加
Gidi Sprintzin

3
这看起来的hackish
锐利边缘

2
cathced java.lang.NullPointerException((
Serg Burlaka '18 -10-16

27

我使用此代码捕获文本查询清除并执行我的操作

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

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

        SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String cs) {
                if (TextUtils.isEmpty(cs)){
                    //Text is cleared, do your thing
                }
                return false;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                //text query submitted
            }
        };
        searchView.setOnQueryTextListener(textChangeListener);

        return true;
    }


2
我使用这种方法遇到的一个问题是,当单击“主页/后退”图标关闭搜索视图时,这似乎也会触发。就我而言,这两个单独的动作需要不同的行为。
user1689757

太好了,这正是我真正需要的!:)
Serg Burlaka '18

4
此答案未解决问题的关键部分-如何区分通过“ x”按钮清除和通过按退格键清除直到没有文本为止的清除。
Joeleski '18

18

如果您使用Appcompat库,而不是使用

getResources().getIdentifier("android:id/search_close_btn", null, null);

你可以这样做:

MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
View closeButton = searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
                closeButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //handle click
                    }
                });

编辑2019年8月:

如果您使用androidx: androidx.appcompat.R.id.search_close_btn


6

如果您使用的是来自androidx的SearchView,则可以执行以下操作:

val closeButton: View? = searchView.findViewById(androidx.appcompat.R.id.search_close_btn)
closeButton?.setOnClickListener { 
    //TODO: Set your action
}

5
    ImageView closeButton = (ImageView) this.searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);

    closeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Manage this event.


        }
    });

使用R.id.search_go_btn的“提交”按钮



1

Eduardo的解决方案对我不起作用。我发现了一些对Kotlin有用的东西。我感谢SjoerdvGestel找到了这个解决方案,它的答案是

// Get the close button on the searchView
val closeButtonId: Int = searching.context.resources.getIdentifier("android:id/search_close_btn", null, null)
val closeButton = searching.findViewById(closeButtonId) as ImageView

// On close collapse the searchView
closeButton.setOnClickListener {
    searching.onActionViewCollapsed()
    true
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.