Android SearchView пустая строка

Я пытаюсь использовать SearchView, и у меня все работает, за исключением случаев, когда я хочу найти пустую строку.
onQueryTextChange реагирует, когда я удаляю последний символ, но я хочу, чтобы пользователь мог нажать кнопку кнопку поиска, когда поле поиска пусто.

 final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextChange(String newText) {
                    // Do something
                    return true;
                }

                @Override
                public boolean onQueryTextSubmit(String query) {
                    // Do something
                    return true;
                }
            };

        searchView.setOnQueryTextListener(queryTextListener);

Я также пытался использовать OnKeyListner. но, похоже, это тоже не работает.

            searchView.setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View arg0, int arg1, KeyEvent arg2) {

                //Do something
                return true;
            }
        }); 

Это кажется такой простой задачей, но я не могу заставить ее работать. Какие-либо предложения?

Изменить

Я некоторое время искал решение, и всего через несколько минут после публикации я нашел решение.
В этой ветке я узнал, что это не ошибка, а на самом деле это было преднамеренно.

Android SearchView.OnQueryTextListener OnQueryTextSubmit не запускается для пустой строки запроса

Поэтому я только что скачал ActionBarSherlock и внес некоторые изменения в метод onSubmitQuery().

От

private void onSubmitQuery() {
    CharSequence query = mQueryTextView.getText();
    if (query != null && TextUtils.getTrimmedLength(query) > 0) {
        if (mOnQueryChangeListener == null
                || !mOnQueryChangeListener.onQueryTextSubmit(query.toString())) {
            if (mSearchable != null) {
                launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, query.toString());
                setImeVisibility(false);
            }
            dismissSuggestions();
        }
    }
}

И измененная версия

private void onSubmitQuery() {
    CharSequence query = mQueryTextView.getText();
    if(query == null) {query = "";}
    if (mOnQueryChangeListener == null
                || !mOnQueryChangeListener.onQueryTextSubmit(query.toString())) {
        if (mSearchable != null) {
                launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, query.toString());
                setImeVisibility(false);
         }
         dismissSuggestions();
    }
}

Надеюсь, это поможет, если у кого-то еще есть эта проблема.


person M3rd0n    schedule 13.04.2013    source источник
comment
Вместо того, чтобы редактировать исходный вопрос, вы можете ответить на свой собственный вопрос.   -  person theblang    schedule 03.07.2014


Ответы (2)


Возможно, это не подходит для вашего приложения, но у вас также есть возможность использовать простой EditText, а затем добавить прослушиватель TextWatcher. Таким образом вы перехватываете каждый ввод, даже если пользователь вводит пустую строку.

person Medhi Redjem    schedule 24.09.2014

У меня была такая же проблема с SearchView, но я не хотел использовать ActionBarSherlock, поэтому я придумал решение, которое состоит в стилизации вашего собственного SearchView, как показано в руководстве http://novoda.com/blog/styling-the-actionbar-searchview/ и настройка OnEditorActionListener для EditText( Как запустить действие, когда пользователь нажал Enter?) который является частью SearchView.

final SearchView searchView = (SearchView)findViewById(R.id.search);
int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
EditText searchPlate = (EditText) searchView.findViewById(searchPlateId);
searchPlate.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            //Do something
        }
        return false;

    });
person Jan Hofman    schedule 15.08.2015