Android -java OnQueryTextSubmit()未调用

时间:2020-04-25 20:31:23

标签: android searchview

我搜索了有关我的问题的所有堆栈溢出答案,但没有运气。我只想使用搜索视图和搜索数据。菜单正确充气。但是当我提交搜索查询时,不会调用onQueryTextSubmit()。我不知道我要去哪里错了。我也没有在searchview上看到“提交”按钮。

这就是方法

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_main,menu);

        MenuItem item = menu.findItem(R.id.action_search);
        SearchView searchView =(SearchView) item.getActionView();
        searchView.setSubmitButtonEnabled(true);
        searchView.setOnQueryTextListener(this);

        return super.onPrepareOptionsMenu(menu);
    }


    @Override
    public boolean onQueryTextSubmit(String query) {
        Toast.makeText(SearchDonorsActivity.this, query, Toast.LENGTH_SHORT).show();
        searchUsers(query);
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        return false;
    }

这是app_bar的布局

<?xml version="1.0" encoding="utf-8"?>
    
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        
        <androidx.appcompat.widget.Toolbar
            android:id="@+id/topAppBar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:title="Search Donors"
            app:menu="@menu/menu_main"
            style="@style/Widget.MaterialComponents.Toolbar.Primary"
            />
    
    </com.google.android.material.appbar.AppBarLayout>
    
</androidx.coordinatorlayout.widget.CoordinatorLayout>

帮我解决这个问题

1 个答案:

答案 0 :(得分:1)

好吧,由于您使用的是菜单项,因此我认为您的实现尚不完整。您需要将其作为搜索窗口小部件进行管理,这在您的代码中并不明显。我的实现如下:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.menu_main, menu)

    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    (menu.findItem(R.id.action_search)?.actionView as SearchView).apply {
        queryHint = getString(R.string.search_donor_name)
        setSearchableInfo(searchManager.getSearchableInfo(componentName))
        setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                if (findNavController(R.id.nav_host_fragment).currentDestination?.id == R.id.fragmentName) {
                    Toast.makeText(SearchDonorsActivity.this, query, Toast.LENGTH_SHORT).show()
                    searchUsers(query)
                }
                return true
            }

            override fun onQueryTextChange(newText: String?): Boolean {
                if (findNavController(R.id.nav_host_fragment).currentDestination?.id == R.id.fragmentName) {
                    Toast.makeText(SearchDonorsActivity.this, query, Toast.LENGTH_SHORT).show()
                    searchUsers(query)
                }
                return true
            }
        })
    }
    // Hide search and show only in fragments with searchable lists
    menu.findItem(R.id.searchItem)?.isVisible = false

    return super.onCreateOptionsMenu(menu)
}

此代码段适用于具有多个片段的单个活动应用程序,这就是为什么我在获得查询之前要检查当前目的地的原因。