Android SearchView是否有监听器通知SearchView已展开并准备好接收输入?

16
我希望在用户还没有输入任何内容时,在SearchView中显示一些默认建议。 我手动设置了自定义建议适配器,使用矩阵光标。我尝试在onFocusChange和onClickListner中设置适配器,但建议会被键盘隐藏,显然建议比键盘先加载。 我没有找到告诉我搜索视图已完全加载键盘的侦听器。 请帮我找到正确的解决方案或任何解决方法。我已经尝试过一个 postDelayed 的解决方法,但这并不是平滑的体验。
我将这段代码放在 onCreateOptionsMenu 中。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.clear();
    final MenuInflater inflater = this.getMenuInflater();
    inflater.inflate(R.menu.searchview_in_menu, menu);
    this.menu=menu;
    basketProductCount = ShoppinglistDataSource.get(getContext()).getProductCountToOrder();
    if(basketProductCount>0 && menu!=null){
        this.activateBasket();
    }

    SearchManager manager = (SearchManager) getSystemService(SEARCH_SERVICE);
    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    mSearchView = (SearchView) searchMenuItem.getActionView();

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

        int searchButtonId = mSearchView.getContext().getResources().getIdentifier("android:id/search_button", null, null);
        ImageView searchButton = (ImageView) mSearchView.findViewById(searchButtonId);
        if(searchButton!=null)
            searchButton.setImageResource(R.drawable.search);



        mSearchView.setSearchableInfo(manager.getSearchableInfo(new ComponentName(getApplicationContext(), SearchProductActivity.class)));
        mSearchView.setIconifiedByDefault(true);
        mSearchView.setIconified(true);
        mSearchView.setQueryHint("Search from 4000+ products");
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String s) {
                Log.d("SEARCH_VIEW_DEBUG","Inside onQueryTextSubmit for query: "+s);
                mSearchView.clearFocus();
                mSearchView.setIconified(true);
                //return false to let the SearchView perform the default action
                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                query = query.toLowerCase().trim();
                Log.d("Query changed to ",query);
                if (query.length() > 1) {
                    Bundle b = new Bundle();
                    b.putString("query",query);
                    if(getLoaderManager().getLoader(1)!=null)
                        getLoaderManager().restartLoader(1, b, suggestionLoaderCallback);
                    else
                        getLoaderManager().initLoader(1, b, suggestionLoaderCallback);
                }
                return true;
            }

        });

        mSearchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View view, boolean queryTextFocused) {
                Log.d("DEBUGGIN", "onFocusChange");
                if(!queryTextFocused) {
                    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                        mSearchView.onActionViewCollapsed();
                        mSearchView.clearFocus();
                    }
                } else {
                    /**This is doing the trick, but not smooth experience**/
              /**also suggestions may get behind the keyboard if keyboard takes time to pop up**/
                    view.postDelayed(new Runnable() {
                        @Override
                        public void run() {

                            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                                mSearchView.onActionViewExpanded();
                                Log.d("DEBUGGIN", "Inside expand");
                                if (mSearchView.getQuery().length() == 0) {

                                    Log.d("DEBUGGIN", "getting default suggestions");
                                    sug.clear();
                                    sug.add("Personal Care");
                                    sug.add("Oil");
                                    sug.add("Spices");
                                    sug.add("Breakfast");
                                    sug.add("Snacks");
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                                        String[] columns = new String[]{"_id", "text"};
                                        Object[] temp = new Object[]{0, "default"};
                                        final MatrixCursor cursor = new MatrixCursor(columns);
                                        int i = 0;
                                        for (i = 0; i < sug.size(); i++) {
                                            if (!sug.get(i).equals("")) {
                                                temp[0] = i;
                                                temp[1] = sug.get(i);
                                                cursor.addRow(temp);
                                            }
                                        }
                                        Log.d("Initial categories", sug.toString());
                                        mSearchView.setSuggestionsAdapter(new CustomSuggestionAdapter(ListAll.this, cursor, sug));
                                        mSearchView.getSuggestionsAdapter().notifyDataSetChanged();
                                        mSearchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
                                            @Override
                                            public boolean onSuggestionSelect(int i) {
                                                Log.d("SEARCH_VIEW_DEBUG", "Inside onSuggestionSelect");



                                                return false;
                                            }

                                            @Override
                                            public boolean onSuggestionClick(int i) {
                                                Log.d("SEARCH_VIEW_DEBUG", "Inside onSuggestionClick");
                                                MatrixCursor cursor = (MatrixCursor) mSearchView.getSuggestionsAdapter().getItem(i);
                                                String suggest1 = cursor.getString(cursor
                                                        .getColumnIndex("text"));
                                                Log.d("Clicked Item", suggest1);
                                                mSearchView.setQuery(suggest1, true);
                                                return true;
                                            }
                                        });
                                    }
                                }
                            }

                        }
                    }, 600);
                }
            }
        });
    }

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                /**This never gets called**/
                Log.d("DEBUGGIN", "Inside onMenuItemActionExpand");
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                /**This never gets called**/
                Log.d("DEBUGGIN", "Inside onMenuItemActionCollapse");
                return true;
            }
        });
    } else {
        MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() {

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                /**This never gets called**/
                Log.d("DEBUGGIN", "Inside MenuItemCompat onMenuItemActionExpand");
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                /**This never gets called**/
                Log.d("DEBUGGIN", "Inside MenuItemCompat onMenuItemActionCollapse");
                return true;
            }
        });
    }

    //return true onCreateOptionsMenu
    return true;
}
4个回答

12
您可以在MenuItem上设置一个展开/折叠监听器,像这样:
menuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {
        return true;
    }

    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        return true;
    }
});

这个监听器是在API 14级引入的,所以为了向后兼容,您必须使用v4支持库。如果您这样做,则必须像这样设置展开/折叠侦听器:

这个监听器是在API 14级引入的,所以为了向后兼容,您必须使用v4支持库。如果您这样做,则必须像这样设置展开/折叠侦听器:

MenuItemCompat.setOnActionExpandListener(this.searchItem, new MenuItemCompat.OnActionExpandListener() {

    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {
        return true;
    }

    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        return true;
    }
});

4
我尝试了这个。onMenuItemActionExpand没有被调用。我在问题中发布了代码。 - Pradeep Sharma
如果您在onCreateOptionsMenu中调用它,则使用以下代码:menu.findItem(R.id.menu_search).setOnActionExpandListener() - SREE
对我也不起作用。 onMenuItemActionExpand和onMenuItemActionCollapse都没有被调用。在API 24的模拟器上尝试过。 - Kiryl Tkach

9

提问者想知道如何判断搜索视图是否已展开。只需使用以下代码即可(假设您的搜索视图是独立的,但如果需要,您可以从菜单项获取引用):

```java boolean isSearchViewExpanded = searchView.isIconified(); ```
这将返回一个布尔值,指示搜索视图是否已展开。如果返回false,则搜索视图已展开,否则未展开。

searchView.setOnSearchClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //search is expanded
                    }
                });

这里是针对封闭环境的情况:

searchView.setOnCloseListener(new SearchView.OnCloseListener() {
                    @Override
                    public boolean onClose() {
// searchview closed
                        return false;
                    }
                });

1
 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        vwSearch = (SearchView) menu.findItem(R.id.menu_main_search).getActionView();
        vwSearch.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                 //Do something on Submit
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                 //Do something on change
                return true;
            }


        });

        vwSearch.setOnCloseListener(new SearchView.OnCloseListener() {
            @Override
            public boolean onClose() {
                //Do something on collapse Searchview
                return false;
            }
        });

        return true;
    }

-1

尝试在AndroidManifest.xml中添加此代码,与您的活动一起,例如您的活动名称为activity1。

<activity
        android:name="com.example.app1.activity1"
        android:label="@string/title_activity_one"
        android:windowSoftInputMode="adjustPan" >
</activity>

你可以使用“adjustResize”而不是“adjustPan”


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