2014-04-14 1 views
15

Ho una barra di azione con un'icona di ricerca. Quando si fa clic sull'icona di ricerca, si espande in una barra di ricerca in cui l'utente può digitare una ricerca.La ricerca nella barra delle azioni non si chiude dopo la ricerca

Il problema si verifica quando l'utente inserisce la ricerca. Vorrei che la barra di ricerca tornasse a un'icona, ma non riesco a farla accadere per tutta la vita.

mio menù ActionBar si presenta così:

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

La mia attività di ricerca si presenta così:

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

    } 



} 

risposta

13

Dopo alcune ricerche, ho trovato la soluzione. Il onActionViewCollapsed funziona ma si è verificato un comportamento imprevisto (icona salta a sinistra, indicatore ancora visibile ...) - questa soluzione (difficile) è stata suggerita nella mia prima e precedente risposta e sono stato persuaso dall'uso del metodo collapseActionView. Tuttavia, SearchView.collapseActionView() non funzionava perché secondo l'Documentation:

comprimere la visualizzazione azione associata con questa voce di menu.

E 'legato alla MenuItem e non al widget SearchView. Ecco perché hai avuto questo errore quando si è utilizzato questo metodo:

Il metodo collapseActionView() è indefinito per il tipo SearchView

Quindi, la soluzione è quella di creare una variabile Menu come segue:

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

O un altro potrebbe essere quello di evitare l'attrezzo SearchView.OnQueryTextListener e per farlo dentro 012.come segue:

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

Questo risolverà sicuramente il problema. Buona programmazione!

+0

Così che quasi ha funzionato perfettamente, è crollato come dovrebbe, ma non ha ancora eseguito la mia ricerca ... Il mio codice simile a questo ora: https://gist.github.com/anonymous/cf26b36c5a22b64459b6 – Mike

+0

è perché avere il listener della query due volte. Assicurati di aver eliminato l'implementatore OnQueryListener e copia/incolla tutti i tuoi file (richiesta json, ecc.) ** all'interno dello stesso listener di query ** in cui stai comprimendo la vista. All'interno del codice sopra il quale fornisci un listener di query. Vedi @ Mike? – Fllo

+0

Vedere la mia risposta aggiornata sopra. Chiama la tua richiesta all'interno dell'ascoltatore nella riga commentata * "chiama la tua richiesta qui" *.HTH @Mike – Fllo

30

Un semplice metodo, che funziona anche se il widget SearchView non è sulla ActionBar è il seguente codice:

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

E che fa il crollo SearchView dopo una ricerca è fatto.

+4

Funziona perfettamente! –