Есть ли какой-либо слушатель в Android SearchView, чтобы уведомить, расширен ли SearchView и готов ли он вводить данные?

Я хочу показать некоторые предложения по умолчанию в 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;
}

person Pradeep Sharma    schedule 06.08.2014    source источник


Ответы (3)


Вы можете установить прослушиватель развертывания/свертывания на 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;
    }
});
person Xaver Kapeller    schedule 06.08.2014
comment
Я попробовал это. onMenuItemActionExpand не вызывается. Я разместил рассматриваемый код. - person Pradeep Sharma; 06.08.2014
comment
Если вы вызываете его в onCreateOptionsMenu, используйте такой код, как menu.findItem(R.id.menu_search).setOnActionExpandListener() - person SREE; 09.08.2017
comment
У меня тоже не работает. Ни onMenuItemActionExpand, ни onMenuItemActionCollapse вообще не вызываются. Пробовал на эмуляторе с API 24. - person Kiryl Tkach; 29.01.2021

спрашивающий хочет знать, как узнать, когда расширяется представление поиска. просто сделайте это с вашим поисковым представлением (при условии, что оно автономное, но при необходимости вы можете получить ссылку на него из пункта меню):

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;
                    }
                });
person j2emanue    schedule 26.07.2018

Попробуйте добавить это в AndroidManifest.xml вместе с вашей активностью, например, имя вашей активности — activity1.

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

вместо "adjustPan" вы можете использовать "adjustResize"

person Ashwani Kumar    schedule 15.08.2014