Подтвердить что ты не робот

Как отклонить/закрыть/свернуть SearchView в ActionBar в MainActivity?

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main_actions, menu);

    searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setOnQueryTextListener(searchListener);

    return super.onCreateOptionsMenu(menu);
}

SearchView.OnQueryTextListener searchListener = new SearchView.OnQueryTextListener(){
    @Override
    public boolean onQueryTextChange(String arg0) {
        return false;
    }
    @Override
    public boolean onQueryTextSubmit(String query) {
        new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
        try {
            searchView.onActionViewCollapsed();
        }
        catch(Exception ex){
            ex.printStackTrace();
            System.out.println(ex);
        }
        return true;
    }
};

Я могу выполнить поиск только в первый раз. Каждый раз он только закрывает мою входную клавиатуру и ничего не делает. Как это можно сделать правильно?

Изменить. Предлагаемое изменение выглядит следующим образом:

        try {
            searchView.setIconified(true);
        }

activity_main_actions.xml:

   <!-- Search Widget -->
   <item android:id="@+id/action_search"
       android:icon="@drawable/ic_action_search"
       android:title="@string/action_search"
       android:showAsAction="always"
       android:actionViewClass="android.widget.SearchView"/>

Edit2:

Я изменил showAsAction="always|collapseActionView", но закрывает мое приложение, когда нажимаю на поиск.

Я также помещаю слушателя внутри OnCreateOptionsMenu, чтобы увидеть, изменит ли он что-либо:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main_actions, menu);
    searchMenuItem = menu.findItem(R.id.action_search); 
    searchView = (SearchView) searchMenuItem.getActionView();
    searchView.setOnQueryTextListener(new OnQueryTextListener(){

            @Override
            public boolean onQueryTextChange(String arg0) {
                return false;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                if (searchMenuItem != null) {
                    boolean closed = searchMenuItem.collapseActionView();
                    Toast.makeText(getApplicationContext(), "closing: " + closed, Toast.LENGTH_SHORT).show();
                }
                new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
                return false;
            }
    });    
    return super.onCreateOptionsMenu(menu);
}

И closed boolean false - я не знаю почему. Я прочитал документ, но он ничего мне не говорит.

Edit3:

Я читал слишком много Интернета по этому вопросу, и пока это не ясно. Виджет поиска очищается, клавиатура скрыта и выполняется действие. Единственная проблема заключается в том, что поиск не сбрасывается, поэтому он охватывает остальные кнопки действий в ActionBar.

            @Override
            public boolean onQueryTextSubmit(String query) {
                searchView.setIconified(true);
                searchView.clearFocus();
                new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query + "&lang=pl").execute();
                return false;
            }

Здесь Я прочитал, что collapseActionView() не будет работать, потому что мой поиск - это не вид, а виджет.

4b9b3361

Ответ 1

Использование:

searchMenuItem.collapseActionView();

Вместо:

searchView.onActionViewCollapsed();

Если вы используете AppCompat library, используйте:

MenuItemCompat.collapseActionView(searchMenuItem);

Ответ 2

В моем случае вызов invalidateOptionsMenu(); закрывает SearchView

Ответ 3

В menu_main.xml добавьте:

<item android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    android:title="Search"
    app:showAsAction="collapseActionView|ifRoom"
    android:orderInCategory="1"
    app:actionViewClass="android.support.v7.widget.SearchView"
    android:menuCategory="secondary"
    />

и в onCreateOptionsMenu

final  MenuItem miSearch = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) miSearch.getActionView();
    searchView.setQueryHint("Searh For");
    searchView.setOnQueryTextListener(newSearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            Toast.makeText(context,query, Toast.LENGTH_LONG).show();
            // Here Put Your Code.
            //searchView.onActionViewCollapsed();
            miSearch.collapseActionView();
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });

Ответ 4

Решение, упомянутое здесь, прост и отлично работает.

В принципе, вызовите setQuery("", false) и setIconified(true) на SearchView.

Ответ 5

Похоже, что то, что вы ищете, - это способ закрыть программу поиска программно. К сожалению, для этого не существует метода или эквивалентного обходного пути. Возможно, вы уже видели еще одно сообщение, в котором были некоторые предложения, но нет реального способа сделать это.

Ваше первое редактирование выше, которое вызывает setIconified(true), является лучшей альтернативой. Документы предполагают, что вызов setIconified(true) должен свернуть виджет поиска, очистить его и удалить из фокуса, если атрибут iconifiedByDefault является истинным (по умолчанию это я не вижу никаких проблем с вашей activity_main_actions.xml).

Ответ 6

Привет, я столкнулся с похожим сценарием, и поэтому я думаю, что это изменилось на код, чтобы сделать трюк. Надеюсь, это поможет...:)

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_actions, menu);
Menu mMenuItem = menu.findItem(R.id.action_search_loc);  // take a reference with menue item
searchView = (SearchView) mMenuItem.getActionView(); //use that to find searchview
searchView.setOnQueryTextListener(searchListener);

return super.onCreateOptionsMenu(menu);
}

SearchView.OnQueryTextListener searchListener = new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String arg0) {
    return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
    new JsoupGetData("http://api.openweathermap.org/data/2.5/find?q="+ query +    "&lang=pl").execute();
    try {
        mMenuItem.collapseActionView(); //this will collapse your search view
    }
    catch(Exception ex){
        ex.printStackTrace();
        System.out.println(ex);
    }
    return true;
}
};