SearchView.OnCloseListener不会被调用(SearchView.OnClose

2019-07-05 14:22发布

即时通讯使用一个操作栏,并添加搜索查看它。 我已经实现了searchView.onCLoseListener但这似乎并没有被得到调用。 有什么建议 ?

我的代码看起来是这样的:

SearchView searchView = new SearchView(getContext());
searchView.setOnCloseListener(new OnCloseListener() {

  public boolean onClose() {
    searchView.setVisibility(SearchView.GONE);
    // Do Something

    return true;
  }
});

Answer 1:

我遇到了同样的问题在Android 4.1.1。 看起来它是一个已知的bug: https://code.google.com/p/android/issues/detail?id=25758

无论如何,作为一种变通方法,我用状态改变监听器(当搜索查看从动作条分离,它也明显地关闭)。

view.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {

    @Override
    public void onViewDetachedFromWindow(View arg0) {
        // search was detached/closed
    }

    @Override
    public void onViewAttachedToWindow(View arg0) {
        // search was opened
    }
});

上面的代码在我的情况下,运作良好。



Answer 2:

好。 我得到的错误。 我们不能添加searchCommand做

setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)

这样做将消除SEARCHTEXT如果有的话,因此我们不能做的OnClose()。



Answer 3:

为了调用的OnClose()从SearchView.OnCloseListener方法。 我做了下面的方式工作。 添加到您的搜索查看

searchView.setIconifiedByDefault(true);
searchView.setOnCloseListener(this);

现在,实现这一监听的onclick

  searchView.findViewById(R.id.search_close_btn)
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                public void onClick(View v) {
                    Log.d("called","this is called.");
                    searchView.setQuery("",false);
                    searchView.setIconified(true);

                }
            });

这为我工作。 共享,以便它可以帮助别人也。 谢谢



Answer 4:

我所做的整理类似的问题是我创建的扩展搜索查看一个新的类:

public class EnglishVerbSearchView extends SearchView {

OnSearchViewCollapsedEventListener mSearchViewCollapsedEventListener;

public EnglishVerbSearchView(Context context) {
    super(context);
}

@Override
public void onActionViewCollapsed() {
    if (mSearchViewCollapsedEventListener != null)
        mSearchViewCollapsedEventListener.onSearchViewCollapsed();
    super.onActionViewCollapsed();
}

public interface OnSearchViewCollapsedEventListener{
    public void onSearchViewCollapsed();
}

public void setOnSearchViewCollapsedEventListener(OnSearchViewCollapsedEventListener eventListener) {
    mSearchViewCollapsedEventListener = eventListener;
}

}

然后,您可以使用这个类而不是搜索查看你的菜单的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
      android:title="@string/action_search"
      android:icon="@drawable/action_search"
      yourapp:showAsAction="ifRoom|collapseActionView"
      yourapp:actionViewClass="com.szymontrapp.englishverbs.EnglishVerbSearchView" />
</menu>

然后你就可以在你的活动添加一个侦听器:

    getMenuInflater().inflate(R.menu.dictionary, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    EnglishVerbSearchView searchView = (EnglishVerbSearchView)      MenuItemCompat.getActionView(searchItem);       

    // Get the SearchView and set the searchable configuration
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    // Assumes current activity is the searchable activity
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default

    searchView.setOnSearchViewCollapsedEventListener(listener);

您还可以覆盖类,取代搜索查看实现其他目标的其他方法。



Answer 5:

当点击“x”图标时得到通知,我增加了一个上点击收听到搜索查看“X”按钮。

通过ID查找搜索查看“X”按钮并附加OnClickListener:

mSearchView.findViewById(R.id.search_close_btn)
    .setOnClickListener(this);

视图search_close_btn存在于由Android框架提供的搜索查看布局。



Answer 6:

    MenuItemCompat.OnActionExpandListener expandListener = new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when action item collapses
            /*Hiding the mic on search visibility*/
                myMenu.findItem(R.id.action_speak).setVisible(false);
            Log.v("test","colllapse");
            return true;  // Return true to collapse action view
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when expanded
            Log.v("test","expand");
            return true;  // Return true to expand action view
        }
    };

    //Searchview Initilisation
    MenuItem searchViewItem = menu.findItem(R.id.action_search);
    // Assign the listener to that action item
    MenuItemCompat.setOnActionExpandListener(searchViewItem, expandListener);

从这里更多信息: https://developer.android.com/training/appbar/action-views.html



Answer 7:

与创建菜单项app:showAsAction设置为始终。

<item   
 android:id="@+id/action_search"  
 android:title="..."  
 android:icon="..."  
 app:actionViewClass="android.support.v7.widget.SearchView"  
 app:showAsAction="always"/>

在创建SearchViewonCreateOptionsMenu方法做这样的事

inflater.inflate(R.menu.menu_search, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView search = (SearchView) item.getActionView();
search.setQueryHint(getString(R.string.search_brand_item));
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  @Override
  public boolean onQueryTextSubmit(String query) {
    // add your code
    return false;
  }

  @Override
  public boolean onQueryTextChange(String newText) {
    // add your code 
    return false;
  }
});
search.setOnCloseListener(new SearchView.OnCloseListener() {
  @Override
  public boolean onClose() {
    // add your code here
    return false;
  }
});
search.setIconifiedByDefault(true); // make sure to set this to true

所述search.setIconifiedByDefault(true)需要被设置为true调用onClose()的方法SearchView.OnCloseListener()上面创建。



Answer 8:

如果您已设置了

searchView.setIconifiedByDefault(false)

那么,你的搜索查看永远不会关闭,因为它总是处于扩展状态。 这就是为什么没有被调用您的OnClose()的原因。



文章来源: SearchView.OnCloseListener does not get invoked