Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SearchView.OnCloseListener未被调用_Java_Android_Android Widget_Searchview - Fatal编程技术网

Java SearchView.OnCloseListener未被调用

Java SearchView.OnCloseListener未被调用,java,android,android-widget,searchview,Java,Android,Android Widget,Searchview,我正在使用一个操作栏并向其中添加一个searchView。我已经实现了searchView.onCLoseListener,但似乎没有调用它。有什么建议吗 我的代码如下所示: SearchView searchView = new SearchView(getContext()); searchView.setOnCloseListener(new OnCloseListener() { public boolean onClose() { searchView.setVisibi

我正在使用一个操作栏并向其中添加一个searchView。我已经实现了searchView.onCLoseListener,但似乎没有调用它。有什么建议吗

我的代码如下所示:

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

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

    return true;
  }
});

嗯。我弄错了。我们无法添加searchCommand和do

setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)

这样做将删除searchText(如果有),因此我们无法执行onClose()。

我所做的是解决类似问题,我创建了一个扩展SearchView的新类:

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文件中使用此类而不是SearchView:

<?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>

您还可以重写类中替代SearchView的其他方法以实现其他目标。

我在android 4.1.1上遇到了同样的问题。看起来这是一个已知的bug:

无论如何,作为一种解决方法,我使用了状态更改侦听器(当SearchView从操作栏分离时,它显然也是关闭的)


以上代码在我的示例中运行良好。

为了在单击“x”图标时得到通知,我在SearchView“x”按钮中添加了一个单击侦听器

按id查找SearchView“x”按钮并附加OnClickListener:

mSearchView.findViewById(R.id.search_close_btn)
    .setOnClickListener(this);
视图搜索\u close\u btn出现在Android框架提供的SearchView布局中。

以便从SearchView.OnCloseListener调用onClose()方法。我用下面的方法使它工作。 将此添加到您的searchview

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);

                }
            });
这对我有用。分享,这样它也能帮助别人。 谢谢

更多信息请点击此处:

如果您已设置

searchView.setIconifiedByDefault(false)

然后,您的searchView永远不会关闭,因为它始终处于展开模式。这就是没有调用onClose()的原因。

创建菜单项时将
app:showAsAction
设置为“始终”

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

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

我也发现了这个问题。解决方案非常简单!只需将您的
SearchView
视图存储在private var中,然后使用

  • isShown
    检查视图是否已展开的方法
  • searchview.addOnLayoutChange
    确定
    searchview
    在执行操作后开始使用
    isShown
  • 使用if
    block(searchView!=null&&searchView.isShown()
    覆盖
    onBackPressed
    ,然后在用户单击后退按钮时执行操作
  • 并用
    isShown
    块覆盖
    OnOptions ItemSelected
    中的
    home(back)
    按钮侦听器。 注意:在菜单项xml文件中删除应用程序:showAsAction collapseActionView标志

这可以从一些额外的解释中受益。我这里有一个类似的问题:。关于如何解决这个问题,有什么想法或想法吗?很好的方法。根据这个答案,你说“你现在安全了,我亲爱的孩子”,我在这里告诉你:“我欠你我的命”.Legit,这个答案非常有效。没有控制SearchView状态的合理选项,经过一天的搜索,我找到了这个,并尝试了它-它只是。有效。发布四年后,它仍然非常相关。应该是公认的答案!我想补充一点,它只对我有效,当我写。。。(new View.OnAtachStateChangeListener()…花了我一段时间,我希望我能抽出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);
searchView.setIconifiedByDefault(false)
<item   
 android:id="@+id/action_search"  
 android:title="..."  
 android:icon="..."  
 app:actionViewClass="android.support.v7.widget.SearchView"  
 app:showAsAction="always"/>
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