Auto Collapse ActionBar SearchView на Soft Keyboard закрыть - PullRequest
76 голосов
/ 09 марта 2012

В настоящее время я использую пункт меню ActionBar для отображения SearchView на панели действий.При расширении пункта меню поиска отображается программная клавиатура, чего я и хочу.Теперь, когда пользователь нажимает кнопку «Назад», чтобы закрыть программную клавиатуру, я также хотел бы свернуть SearchView в панели действий.

Я попытался реализовать следующие слушатели OnKeyListener и OnFocusChangeListener на MenuItem и ActionView,Я также пытался использовать OnBackPressed () в Activity.Ничто из вышеперечисленного не обнаруживает, когда кнопка «Назад» используется для закрытия программной клавиатуры.

Есть идеи?

Я реализовал OnActionExpandListener, чтобы знать, когда SearchView виден.

Ответы [ 11 ]

98 голосов
/ 10 января 2013

Я расширю ответ @ user1258568 для ленивых. Это сработало для меня. Обратите внимание, что он очищает ваш запрос при потере фокуса.

final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search);
final SearchView searchView = (SearchView) searchMenuItem.getActionView();

searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View view, boolean queryTextFocused) {
        if(!queryTextFocused) {
            searchMenuItem.collapseActionView();
            searchView.setQuery("", false);
        }
    }
});
37 голосов
/ 12 марта 2012

Я нашел лучшее решение.

searchView.setOnQueryTextFocusChangeListener(). 

OnQueryTextFocusChangeListener вызывается, когда клавиатура отображается или скрыта. Сначала вызывается, когда отображается клавиатура, и окно поиска будет иметь фокус. Вызывается снова, когда keyboard скрыт, а представление поиска теряет фокус, может close search view, затем использовать

menuItem.collapseActionView().
10 голосов
/ 18 апреля 2012

Просто переопределить наBackPressed как это:

@Override
    public void onBackPressed() {
        if (searchView.isShown()){
            searchView.onActionViewCollapsed();  //collapse your ActionView
            searchView.setQuery("",false);       //clears your query without submit
            isClosed = true;                     //needed to handle closed by back
        } else{
            super.onBackPressed();
        }
    }

и ваш onCreateOptionsMenu будет раздувать mSearchView следующим образом:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_search, menu);
        mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView();
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setOnSearchClickListener(this);
        mSearchView.setOnCloseListener(this);
        isClosed = true;
        return true;
    }

попросите ли вы класс реализовать следующее:

public class myActivity extends FragmentActivity implements
    SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener {

, который вам также понадобится:

@Override
public void onClick(View view) {
    isClosed = false;
}

@Override
public boolean onClose() {
    isClosed = true;
    return false;
}

Вам нужно будет сделать "mSearchView" и "isClosed" обе глобальные переменные для действия.

2 голосов
/ 11 апреля 2016

Вам нужно только добавить атрибут «collapseActionView» в макет меню

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_item_search"
        android:title="@string/search"
        android:iconifiedByDefault="true"
        android:icon="@drawable/ic_action_search" 
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView"/> <--this one
</menu>

Это даст вам функциональность, которую вы ищете, сама по себе. Не забудьте вызвать метод clearFocus в SearchView, чтобы закрыть клавиатуру после отправки запроса.

2 голосов
/ 11 февраля 2015

Ответ от Джона Уиллиса прекрасно работает.Это улучшение его ответа.

Сначала создайте новый класс, который реализует View.OnFocusChangeListener:

public class SearchViewFocusListener implements View.OnFocusChangeListener {

    private final MenuItem mMenuItem;

    public SearchViewFocusListener(MenuItem menuItem) {
        mMenuItem = menuItem;
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            mMenuItem.collapseActionView();
            if (v instanceof SearchView) {
                ((SearchView) v).setQuery("", false);
            }
        }
    }

}

Затем установите слушателя на SearchView:

searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem));
1 голос
/ 06 октября 2014

Это достижимо так:

   private void setupSearchView(Menu menu) {
        final MenuItem searchMenuItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) searchMenuItem.getActionView();

        [...]

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                searchMenuItem.collapseActionView();
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                return true;
            }
        });
    }

Решения, основанные на setOnQueryTextFocusChangeListener (), у меня не работали, потому что событие не было запущено - searchView не терял фокус при отправке, вероятно, потому что я выполняю поиск в той же операции, которая содержит представление поиска.

Во всяком случае, я думаю, что использование OnQueryTextListener более правильно, так как оно более точно описывает событие отправки текста.

1 голос
/ 20 августа 2013

Это то, что я сделал, чтобы клавиатура исчезла. Вы можете попытаться увидеть, работает ли это для вас. Я установил searchView на невидимое, а затем снова на видимое.

    //set query change listener
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
        @Override
        public boolean onQueryTextChange(String newText) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onQueryTextSubmit(String query) {
            /**
             * hides and then unhides search tab to make sure keyboard disappears when query is submitted
             */
                  searchView.setVisibility(View.INVISIBLE);
                  searchView.setVisibility(View.VISIBLE);
            return false;
        }

     });
0 голосов
/ 09 декабря 2015

По какой-то причине menuItem.collapseActionView() не работает, поэтому я использовал searchView.setIconified(true).

Это дает приведенный ниже результат в качестве примера кода.

final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search);
final SearchView searchView = (SearchView) searchItem.getActionView();

searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            searchView.setIconified(true);
        }
    }
});
0 голосов
/ 13 мая 2015

Вам нужно вызвать setIconified дважды.

Чтобы свернуть окно поиска и закрыть клавиатуру.
При первом вызове текст поискового экрана очищается с помощью клавиатуры второго вызова, а поисковый экран закрывается.

0 голосов
/ 23 апреля 2015

Если вы хотите свернуть клавиатуру, когда пользователь нажимает значок поиска на клавиатуре, это можно сделать простым

inside onquerytextsubmitted {

searchView.clearfocus()

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...