Android-абс с SearchView, onQueryTextListener не работает

Я пытаюсь использовать версию SearchView Support v4 с панелью действий sherlock.

Итак, у меня есть кнопка поиска на панели действий -> когда я касаюсь ее, появляется клавиатура и панель поиска.

Моя проблема в том, что мне нужно использовать прослушиватели onQueryTextSubmit и onQueryTextChange, но они никогда не запускаются. Мне нужно использовать строку запроса поиска и делать с ней пользовательские вещи.

Вот полная активность.java

public class ActivityMain extends SherlockFragmentActivity implements OnQueryTextListener, DialogFragmentListener {
    /**
     * PRIVATE ATTRIBUTES
     */
    private static final String TAG                             = "ActivityMain";
    private ViewPager           _viewPager;
    private TabsAdapter         _tabsAdapter;
    private DialogFiltre        _dialogFiltre;
    private String              _searchCurrentQuery;
    // data
    private boolean             _doubleBackToExitPressedOnce    = false;


    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        menu.clear();
        switch ((int) _viewPager.getCurrentItem()) {
            case 0:
                getSupportMenuInflater().inflate(R.menu.empty_menu, menu);
                break;
            case 1:
                getSupportMenuInflater().inflate(R.menu.action_bar_menu, menu);
                break;
            case 2:
                getSupportMenuInflater().inflate(R.menu.empty_menu, menu);
                break;
        }
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getSupportMenuInflater().inflate(R.menu.action_bar_menu, menu);
        MenuItem searchItem = menu.findItem(R.id.search);
        SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setSubmitButtonEnabled(true);
        searchView.setOnQueryTextListener(queryTextListener);
        return true;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {

        Log.i(TAG, "onQueryTextSubmit--");
        onSearchClicked(query);
        // hide keyboard
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {

        Log.d(TAG, "onQueryTextChange--");
        _searchCurrentQuery = newText.toString();
        EtablissementApplication._adapter.getFilter().filter(_searchCurrentQuery);
        return true;
    }

    private void onSearchClicked(String query) {

        Log.d(TAG, "onSearchClicked--");
        _searchCurrentQuery = query.toString();
        EtablissementApplication._adapter.getFilter().filter(_searchCurrentQuery);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case android.R.id.home:
                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                break;
            case R.id.search:
                break;
            case R.id.menu_filtre:
                _dialogFiltre = DialogFiltre.newInstance(R.string.menu_filtre, this);
                _dialogFiltre.setValidDialogListener(this);
                _dialogFiltre.show(getSupportFragmentManager(), null);
                break;
        }
        return super.onOptionsItemSelected(item);
    }

person An-droid    schedule 31.05.2013    source источник


Ответы (3)


Вы пытаетесь использовать новый SearchView вместо созданного SupportMenuInflater. Вы настраиваете слушателя на другой SearchView, который вы видите на экране. Кроме того, каждый раз, когда вызывается onPrepareOptionsMenu, создается новый SearchView, и поэтому для него не установлены слушатели.

Попробуйте сделать onPrepareOptionsMenu следующим образом:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    menu.clear();
    switch ((int) _viewPager.getCurrentItem()) {
        case 0:
            getSupportMenuInflater().inflate(R.menu.empty_menu, menu);
            break;
        case 1:
            getSupportMenuInflater().inflate(R.menu.action_bar_menu, menu);
            MenuItem searchItem = menu.findItem(R.id.search);
            SearchView searchView = (SearchView) searchItem.getActionView();
            searchView.setSubmitButtonEnabled(true);
            searchView.setOnQueryTextListener(queryTextListener);
            break;
        case 2:
            getSupportMenuInflater().inflate(R.menu.empty_menu, menu);
            break;
    }
    return super.onPrepareOptionsMenu(menu);
}

И удалите переопределенный метод

@Override
public boolean onCreateOptionsMenu(Menu menu) { }
person Yaroslav Mytkalyk    schedule 31.05.2013
comment
ваше предложение хорошее, я пытался, но я все еще не получу свой журнал. Есть ли что-то, что мне нужно установить в манифесте или где-либо еще, что может заблокировать слушателей? - person An-droid; 31.05.2013
comment
Из предоставленного вами фрагмента я не вижу никаких других ошибок. Опубликуйте полный код действия с импортом, и, возможно, мы что-то увидим. - person Yaroslav Mytkalyk; 31.05.2013
comment
я скопировал всю активность, когда проблема будет решена, я удалю ее из поста... - person An-droid; 31.05.2013
comment
вы спасатель, это работает !! Но я до сих пор не понимаю, почему мне нужно только onPrepareOptionsMenu(). Я думал, что оба метода необходимы для правильной настройки меню ›.‹ - person An-droid; 31.05.2013
comment
OnCreateOptionsMenu вызывается только один раз, но onPrepareOptionsMenu можно вызывать каждый раз, когда меню становится недействительным. Menu.clear();, getSupportMenuInflater().inflate вызываются несколько раз после onCreateOptionsMenu и, таким образом, создают новый объект SearchView без слушателей. - person Yaroslav Mytkalyk; 31.05.2013
comment
ааа, я вижу, проблема связана с menu.clear(), который я вызываю для обновления элементов меню. Спасибо за помощь. Кстати, можно ваше мнение. Каков наилучший/самый простой способ изменить элементы меню в соответствии с текущей вкладкой с помощью Abs? - person An-droid; 31.05.2013
comment
@ Yume117 поместите свои меню во фрагменты. stackoverflow.com/questions/8308695/ - person Yaroslav Mytkalyk; 31.05.2013

Возможно, вам придется установить searchView.setOnQueryTextListener(this); в вашей ссылке SearchView.

person Haseeb Pavaratty    schedule 30.03.2019

Лучший результат в Google, поэтому добавление новой возможной причины вызвало у меня головную боль. Помните, на какую SearchView реализацию вы ссылаетесь.

У меня это не сработало (компилируется, не падает, но слушатель не работает):

    <!--actionbar.xml-->
    ...
    <item android:id="@+id/search"
        android:title="@string/action_search"
        android:icon="@drawable/ic_search"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="android.widget.SearchView"/>
    ...
    // Activity#onCreateOptionsMenu(android.view.Menu)
    val searchView: SearchView = menu.findItem(R.id.search).actionView as android.widget.SearchView
    searchView.setOnQueryTextListener(...)

Это делает (компилируется, не падает, и слушатель работает):

    <!--actionbar.xml-->
    ...
    <item android:id="@+id/search"
        android:title="@string/action_search"
        android:icon="@drawable/ic_search"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="androidx.appcompat.widget.SearchView"/>
    ...
    // Activity#onCreateOptionsMenu(android.view.Menu)
    val searchView: SearchView = menu.findItem(R.id.search).actionView as androidx.appcompat.widget.SearchView
    searchView.setOnQueryTextListener(...)
person Michael Jess    schedule 25.06.2021