安卓SearchView点击事件

17

我有一个搜索视图,长这样:

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>

所以,搜索视图的行为是,当点击搜索按钮时,键盘会弹出。现在我可以搜索一些内容。有没有可能通过在搜索视图的任何位置单击来进行搜索?有人有示例可以给我吗?


1
这里有一个很好的答案:https://dev59.com/X2Uq5IYBdhLWcg3wT-yD - Sirop4ik
6个回答

17

我是这样做的:

在点击监听器中设置搜索视图

mSearchView.setOnClickListener(this);

捕获onClick事件:

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

如果您在搜索栏的任何地方点击,将激活键盘和搜索功能。


8
这将完全实现你想要达到的目标。 setIconified(false)会保持SearchView末端的叉号图标,这样用户仍然可以通过点击它来取消搜索,就像点击放大镜一样。
searchView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        searchView.setIconified(false);
    }
});

7
我建议使用 setOnSearchClickListener 监听器来检测 SearchView 的点击,因为根据 Android 文档

setOnSearchClickListener

void setOnSearchClickListener (View.OnClickListener listener)

设置一个监听器,在搜索按钮被按下时通知。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.orders_menu, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

    if (searchView != null) {
        searchView = (SearchView) searchItem.getActionView();
        searchView.setOnSearchClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              //perform your click operation here 
            }
        });
  return true;
}

0

我不明白为什么你需要在其中设置OnClickListener。通过点击SearchView,您将更新文本光标。要执行搜索,您需要使用键盘IME操作。如果单击它会执行搜索,则无法更改光标等等。在文本字段中除了焦点/更新光标之外,做其他事情通常是错误的行为。

据我所记 - 您不需要在OnQueryTextListener中隐藏键盘。它应该自动隐藏。在OnQueryTextSubmit中处理您的搜索

用Sherlock ActionBar SearchView setOnKeyListener进行搜索


0
如果您设置了android:iconifiedByDefault="false",并且setOnSearchClickListener没有生效。您可以尝试:
searchView.setOnQueryTextListener(QueryTextListener(searchView))

class QueryTextListener(private val searchView: SearchView) : OnQueryTextListener {
    override fun onQueryTextSubmit(query: String?): Boolean {
        // do something
        searchView.clearFocus()
        return true
    }

    override fun onQueryTextChange(newText: String?): Boolean {
        return true
    }
}

0
一个搜索小部件,拦截其子元素上的所有触摸事件,并在按下时进行回调:
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_view.onActionDownIntercepted = { onSearchFieldClicked() }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接