14

我必须按两次后退按钮才能关闭SearchView. 为什么?在第一次按下时,SearchView唯一的焦点是……

设置也不起作用setOnKeyListener...SearchView

顺便说一句,我正在使用 ABS 实现......

我的代码很简单,如下所示:

mMenuItemSearch = menu.findItem(R.id.search);
mSearchView = new SearchView(getSupportActionBar().getThemedContext());
mMenuItemSearch.setActionView(mSearchView);

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
{
    public boolean onQueryTextChange(String newText)
    {
        mPagerManager.getFragment(mSelectedPos).adapter.getFilter().filter(newText);
        return true;
    }

    public boolean onQueryTextSubmit(String query)
    {
        return true;
    }
});
4

11 回答 11

3

在尝试了很多之后,我找到了解决方案。

onQueryTextSubmit(String query)searchView.clearFocus();

然后在onBackPressed()下面的代码中使用:

        if (!searchView.isIconified())
        {
            searchView.setIconified(true);
            searchView.onActionViewCollapsed();
        }
        else
        {
            super.onBackPressed();
        }
于 2016-12-09T08:21:24.697 回答
1

onBackPressed 应该只从搜索视图(SearchAutoComplete)EditText 中清除焦点,这是正常行为。

但如果你想改变这种行为,那就去做吧(:

    final SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
    final MenuItem searchViewItem = menu.findItem(R.id.searchView);

    searchAutoComplete.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(!searchAutoComplete.isFocused()){
                searchViewItem.collapseActionView();
                searchView.onActionViewCollapsed();
                viewManager.dismissSearchDropDownPopupWindow();
            }
        }
    });
于 2017-04-21T22:47:40.717 回答
1

尝试这个。在尝试了很多事情之后,它对我有用。

mSearchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
  @Override
  public void onFocusChange(View v, boolean hasFocus) {
    if (!hasFocus) {
      MenuItemCompat.collapseActionView(searchMenu);
    }
  }
});
于 2019-01-30T18:04:08.217 回答
0

向后关闭的搜索视图是预期的行为,也是我们习惯的行为。如果您想通过扩展您自己的 SearchView 和/或监听 onBackPressed() 来调用 SearchView 所在活动的完成,您可以覆盖它。

于 2013-09-20T20:35:43.927 回答
0

我是这样解决的:

...
public class MyFragment extends Fragment implemented SearchView.OnFocusChangeListener    <----
...

@Override
public void onFocusChange(View v, boolean hasFocus) {
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView sv = (SearchView)MenuItemCompat.getActionView(menuItem);
    if(!hasFocus) {
        sv.onActionViewCollapsed();   <----
        interactionListener.showDrawerToggle(true);    <----
    }
}

...

public void configureSearchView(Menu menu) {
    this.menu = menu;
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView sv = (SearchView)MenuItemCompat.getActionView(menuItem);
    sv.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            interactionListener.showDrawerToggle(false);
        }
    });

    sv.setOnQueryTextListener(this);
    sv.setOnCloseListener(this);
    sv.setSubmitButtonEnabled(false);
    sv.setIconifiedByDefault(true);
    sv.setOnQueryTextFocusChangeListener(this);     <----

    if(initialQuery != null) {
        sv.setIconified(false);
        menuItem.expandActionView();
        sv.setQuery(initialQuery, true);
    }
}
...
于 2015-05-31T19:12:45.707 回答
0

单击搜索按钮后 需要调用clearFocus()方法。 例如:SearchView

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        mSearchView.clearFocus();
        //...
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        return false;
    }
});
于 2017-12-28T09:49:41.520 回答
0

如果您SearchView在像我这样的片段上,请在Kotlin中使用以下片段

searchView.setOnQueryTextFocusChangeListener { _, hasFocus ->
      if(!hasFocus){

         // iconify the SearchView when the focus is lost
         searchView.isIconified = true
      }
 }

感谢@vikoo 的回答

于 2019-07-29T13:01:59.673 回答
0

您需要扩展SearchView和覆盖dispatchKeyEventPreIme

public class SearchView extends android.support.v7.widget.SearchView {
    public SearchView(Context context) {
        super(context);
    }

    public SearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SearchView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
                onActionViewCollapsed();
            }
        }

        return super.dispatchKeyEventPreIme(event);
    }
}
于 2017-01-26T03:25:11.040 回答
0

解决此问题的唯一方法是使用android.support.v7.widget.SearchView而不是android.widget.SearchView

我通过这样做修复了它。

于 2017-01-04T10:30:15.603 回答
0

在你的 configureSearchView() 方法中试试这个,它对我有用。

    mSearchView.post(new Runnable() {
        @Override
        public void run() {
            mSearchView.setIconified(false);
        }
    });
于 2016-01-28T07:50:47.403 回答
-1

您可以调用view.requestFocus()以将重点放在另一个视图上。这样一来,搜索视图就会关闭。

于 2013-12-06T10:27:19.863 回答