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

Поиск по запросу не будет закрыт после поиска

У меня есть панель действий со значком поиска. При щелчке по значку поиска он расширяется до строки поиска, в которой пользователь может ввести поиск.

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

Меню моей панели действий выглядит следующим образом:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity" >

    <item android:id="@+id/menu_search2"
        android:actionViewClass="android.widget.SearchView"
        android:title="Search"
        android:icon="@android:drawable/ic_menu_search"
        android:showAsAction="always|collapseActionView|"
        android:onClick="goToSearch"
        />

    <item android:id="@+id/action_scan"
        android:icon="@drawable/barcode"
        android:onClick="scanBarcode"
        android:showAsAction="ifRoom|collapseActionView"
        />

</menu>

Моя активность поиска выглядит следующим образом:

public class Search extends Fragment implements SearchView.OnQueryTextListener, ReadJSONResult.OnArticleSelectedListener {

    private ListView lv;
    View v;
    SearchView searchView;
    private SearchView mSearchView;
    private MenuItem mSearchMenuItem;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        //set layout here
        v = inflater.inflate(R.layout.activity_search, container, false);
        setHasOptionsMenu(true);
        getActivity().setTitle("Search");


        //get user information
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        String userName = prefs.getString("userName", null);
        String userID = prefs.getString("userID", null);


        return v;


}

    @Override
    public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
        // Inflate the menu; this adds items to the action bar if it is present.

        searchView = (SearchView) menu.findItem(R.id.menu_search2).getActionView();
        searchView.setOnQueryTextListener(this);
        searchView.setIconified(false);
    }


    public boolean onQueryTextSubmit (String query) {

        //toast query
        //make json variables to fill
        searchView.setIconified(true);
        searchView.clearFocus();

        // url to make request
        String url = "myURL";



        try {
            query = URLEncoder.encode(query, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        String jsonUrl = url + query;


        //todo: get json
        ReadJSONResult task = new ReadJSONResult(getActivity());
        task.setOnArticleSelectedListener(this);
        task.execute(jsonUrl);

        return false;
    }





    @Override
    public boolean onQueryTextChange(String newText) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onArticleSelected(String b, String brewery){
        searchView.setIconified(true);
        searchView.clearFocus();
        searchView.postInvalidate();
        //code to execute on click
        Fragment Fragment_one;
        FragmentManager man= getFragmentManager();
        FragmentTransaction tran = man.beginTransaction();

        //adds beer data to shared prefs for beer tabs
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("beerID",b);
        editor.putString("breweryID",brewery);
        editor.commit();
        Fragment_one = new BeerTabs();

        tran.replace(R.id.main, Fragment_one);//tran.
        tran.addToBackStack(null);
        tran.commit();

    }



}
4b9b3361

Ответ 1

После некоторых поисков я нахожу решение. onActionViewCollapsed работает, но у вас было неожиданное поведение (значок прыгает влево, индикатор вверх по-прежнему здесь...) - это (жесткое) решение было предложено в моем первом и предыдущем ответах, и я был убежден с помощью collapseActionView метод. Однако SearchView.collapseActionView() не работал, потому что согласно Документация:

Свернуть это действие, связанное с этим пунктом меню.

Он связан с MenuItem, а не с SearchView. Вот почему вы использовали эту ошибку при использовании этого метода:

Метод collapseActionView() - undefined для типа SearchView

Тогда решение состоит в создании переменной Menu следующим образом:

 // At the top of your class
 private Menu mMenu;

 // onCreateOptionsMenu method
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
      this.mMenu = menu; // init the variable
      // other stuff..
      return true;
 }

 // call the collapseActionView method
 public boolean onQueryTextSubmit(String query) {
      searchView.setIconified(true);
      searchView.clearFocus();
      // call your request, do some stuff..

      // collapse the action view
      if (mMenu != null) { 
          (mMenu.findItem(R.id.menu_search2)).collapseActionView();
      }
      return false;
 }

Или другим может быть избежать реализации SearchView.OnQueryTextListener и сделать это внутри onCreateOptionsMenu следующим образом:

@Override
// make your Menu as 'final' variable
public void onCreateOptionsMenu (final Menu menu, MenuInflater inflater) {
    searchView = (SearchView) menu.findItem(R.id.menu_search2).getActionView();
    // call the query listener directly on the SearchView
    searchView.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            searchView.setIconified(true);
            searchView.clearFocus();

            // call the request here

            // call collapse action view on 'MenuItem'
            (menu.findItem(R.id.menu_search2)).collapseActionView();

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

Это решит проблему точно. Счастливое кодирование!

Ответ 2

Один более простой способ, который работает, даже если виджет SearchView не находится на панели действий, следующий код:

searchView.setQuery("", false);
searchView.setIconified(true);

И это приводит к краху SearchView после выполнения поиска.