Android SearchView onclick

Android SearchView onclick,android,onclick,searchview,Android,Onclick,Searchview,我有一个如下所示的searchView: private void setupSearchView() { mSearchView = (SearchView) getActivity().findViewById( R.id.search_view_neue); setSearchViewBackground(); mSearchView.setOnClickListener(this); mSearchView.setOnQueryTe

我有一个如下所示的searchView:

private void setupSearchView() {
    mSearchView = (SearchView) getActivity().findViewById(
            R.id.search_view_neue);
    setSearchViewBackground();
    mSearchView.setOnClickListener(this);
    mSearchView.setOnQueryTextListener(this);
}




    public boolean onQueryTextSubmit(String query) {
    searchcounter = searchcounter + 1;

    setSearchViewBackground();
    ArrayList<WissensdokumenteRecord> documents = settingListContent(new ArrayList<WissensdokumenteRecord>());

    setListAdapter(new NeueWissensdokumentItemAdapter(
            inflater.getContext(), R.layout.row_example, documents));
    InputMethodManager im = (InputMethodManager) getActivity()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    im.hideSoftInputFromWindow(getActivity().getCurrentFocus()
            .getWindowToken(), 0);

    return false;
}




<SearchView
    android:id="@+id/search_view_neue"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_marginLeft="40dp"
    android:layout_marginRight="40dp"
    android:background="@drawable/border_searchview"
    android:maxWidth="540dp"
    android:queryHint="Neue Dokumente suchen" >
</SearchView>
private void setupSearchView(){
mSearchView=(SearchView)getActivity().findViewById(
R.id.search\u view\u neue);
setSearchViewBackground();
mSearchView.setOnClickListener(此);
mSearchView.setOnQueryTextListener(此);
}
公共布尔值onQueryTextSubmit(字符串查询){
searchcounter=searchcounter+1;
setSearchViewBackground();
ArrayList documents=settingListContent(新的ArrayList());
setListAdapter(新的NeueWissensdokumentItemAdapter(
filter.getContext(),R.layout.row_示例,documents));
InputMethodManager im=(InputMethodManager)getActivity()
.getSystemService(Context.INPUT\u方法\u服务);
im.hideSoftInputFromWindow(getActivity().getCurrentFocus())
.getWindowToken(),0);
返回false;
}

因此,搜索视图的行为是,通过单击搜索按钮打开键盘。现在我可以找东西了。是否可以通过单击searchview中的任意位置进行搜索?有人给我举个例子吗?

我不明白为什么需要设置OnClickListener。 通过单击SearchView,您将更新文本光标。要执行搜索,您需要键盘输入法操作。如果单击它将执行搜索,则不可能更改光标等。在文本字段中进行焦点/更新光标以外的操作通常是错误的

据我记忆所及,您不需要在OnQueryTextListener中隐藏键盘。它应该自动亮起。在OnQueryTextSubmit中处理搜索


我通过以下方式做到了这一点:

在单击listener时设置搜索视图

mSearchView.setOnClickListener(this);
捕获onClick事件:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.searchView:
            mSearchView.onActionViewExpanded();
            break;
    }
}

通过这种方式,如果您单击搜索栏上的antwhere,键盘和搜索将被激活。

我必须建议使用
setOnSearchClickListener
listner来检测
SearchView
根据安卓系统进行单击:

设置搜索单击侦听器

void setOnSearchClickListener(View.OnClickListener listener)

设置在按下搜索按钮时通知的侦听器


这正是你想要达到的。
setIconified(false)
将在SearchView的这一端保留十字图标,这样用户仍然可以像单击放大镜一样取消

searchView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        searchView.setIconified(false);
    }
});

一个搜索小部件,截取其子项上的所有触碰,并在触碰时进行回调:

class InterceptTouchSearchView(context: Context, attrs: AttributeSet) : SearchView(context, attrs) {

  var onActionDownIntercepted: (() -> (Unit))? = null

  override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
    return true
  }

  @SuppressLint("ClickableViewAccessibility")
  override fun onTouchEvent(ev: MotionEvent?): Boolean {
    if (ev?.action == MotionEvent.ACTION_DOWN) {
      onActionDownIntercepted?.invoke()
    }
    return false
  }
}
用法:
search\u view.onActionDownIntercepted={onSearchFieldClicked()}

答案很好
class InterceptTouchSearchView(context: Context, attrs: AttributeSet) : SearchView(context, attrs) {

  var onActionDownIntercepted: (() -> (Unit))? = null

  override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
    return true
  }

  @SuppressLint("ClickableViewAccessibility")
  override fun onTouchEvent(ev: MotionEvent?): Boolean {
    if (ev?.action == MotionEvent.ACTION_DOWN) {
      onActionDownIntercepted?.invoke()
    }
    return false
  }
}