2014-04-14 16 views
15

Mam pasek akcji z ikoną wyszukiwania. Po kliknięciu ikony wyszukiwania rozwija się do paska wyszukiwania, w którym użytkownik może wpisać zapytanie.Funkcja wyszukiwania paska zadań nie zamyka się po wyszukiwaniu

Problem pojawia się, gdy użytkownik wprowadza wyszukiwanie Chciałbym, aby pasek wyszukiwania zwinął się z powrotem do ikony, ale nie mogę tego zrobić dla mojego życia.

Moje menu actionbar wygląda następująco:

<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> 

Moja aktywność wyszukiwania wygląda następująco:

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(); 

    } 



} 

Odpowiedz

13

Po kilku wyszukiwań znajdę rozwiązanie. The onActionViewCollapsed działa, ale masz nieoczekiwane zachowanie (ikona przeskakuje w lewo, a wskaźnik wciąż tu jest ...) - to (trudne) rozwiązanie zostało zasugerowane w mojej pierwszej i poprzedniej odpowiedzi, a mnie przekonało użycie metody collapseActionView. Jednak SearchView.collapseActionView() nie działa, ponieważ zgodnie z Documentation:

zwinąć widok akcja związana z tej pozycji menu.

Jest związana z MenuItem i nie do widgetu SearchView. Dlatego miałem ten błąd, gdy stosowali tę metodę:

Sposób collapseActionView() jest niezdefiniowana dla typ SearchView

Wtedy rozwiązaniem jest utworzenie zmiennej Menu jako następująco:

// 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; 
} 

Albo inny może być do uniknięcia wdrożenia SearchView.OnQueryTextListener i zrobić to wewnątrz onCreateOptionsMenu w następujący sposób:

@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); 
} 

To rozwiąże problem na pewno. Szczęśliwe kodowanie!

+0

Tak, że niemal pracował doskonale, że załamał się tak jak powinien, ale nie zrobił wykonać moje poszukiwania ... Mój kod wygląda teraz: https://gist.github.com/anonymous/cf26b36c5a22b64459b6 – Mike

+0

to dlatego, mieć dwa razy program nasłuchujący zapytania. Upewnij się, że usunąłeś narzędzie OnQueryListener i skopiuj/wklej wszystkie swoje rzeczy (żądanie json, itp.) ** wewnątrz tego samego detektora zapytań **, w którym zwijasz widok. Wewnątrz powyższego kodu zapewniającego odbiorcę zapytania. Czy widzisz @Mike? – Fllo

+0

Zobacz moją zaktualizowaną odpowiedź powyżej. Zadzwoń do swojego żądania w odbiorniku w skomentowanej linii * "zadzwoń tutaj" *.HTH @Mike – Fllo

30

Jeden prostszy sposób, że działa nawet wtedy, gdy nie jest widget SearchView na actionbar jest następujący kod:

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

I sprawia, że ​​upadek SearchView po wyszukiwanie jest wykonany.

+4

To działa idealnie! –

Powiązane problemy