如果SearchView已扩展并准备好接受输入,Android SearchView上是否有任何监听器可以通知?

时间:2014-08-06 10:39:54

标签: android searchview android-search

当用户没有输入任何内容时,我想在SearchView中显示一些默认建议。 我正在使用矩阵光标手动设置我的自定义建议适配器。我尝试在onFocusChange和onClickListner中设置适配器,但建议隐藏在键盘后面,显然建议比键盘更早加载。 我没有找到任何监听器告诉我searchview在视图中完全加载了键盘。 帮助我找到正确的解决方案或任何解决方法。我尝试了一种解决方法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 个答案:

答案 0 :(得分:6)

您可以在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支持库。如果你这样做,你必须像这样设置展开/折叠监听器:

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

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

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

答案 1 :(得分: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;
    }

答案 2 :(得分:1)

提问者想知道如何知道何时扩展搜索视图。只需在您的searchview中执行此操作即可(假设它是独立视图,但是如果需要,您可以从菜单项中获得对其的引用):

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

答案 3 :(得分:-1)

尝试在AndroidManifest.xml中添加此项以及您的活动,例如您的活动名称为activity1。

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

而不是“adjustPan”,您可以使用“adjustResize”