2014-04-14 26 views
15

Arama simgeli bir hareket arabam var. Arama simgesi tıklandığında, kullanıcının aramada yazabileceği bir arama çubuğuna genişler.actionbar search aramadan sonra kapanmıyor

Sorun, kullanıcı aramaya girdiğinde, arama çubuğunun bir simgeye geri dönüşmesini isterim ancak benim hayatımın gerçekleşmesini sağlayamıyorum.

Benim İşlem Çubuğu menüsü şöyle görünür:

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

Arama faaliyeti şöyle görünür:

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

    } 



} 

cevap

13

Bazı aramalarda sonra çözüm bulmak. onActionViewCollapsed çalışır ancak beklenmedik bir davranışınız oldu (simge sola, yukarı işareti hala buralar ...) - bu (sabit) çözüm benim ilk ve önceki yanıtımda önerildi ve collapseActionView yöntemini kullanarak ikna oldum. Ancak SearchView.collapseActionView() çalışma değildi çünkü Documentation göre:

Collapse bu menü öğesi ile ilişkilendirilmiş eylem görünümü.

O MenuItem değil SearchView Widget'a ile ilgili var. Bu yöntemi kullanıldığında bu hatayı olmasının nedeni de budur:

yöntem collapseActionView() çözüm olarak bir Menu değişkeni oluşturmaktır,

Sonra tip SearchView için tanımlanmamıştır aşağıdaki gibidir:

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

Ya SearchView.OnQueryTextListener uygulamak veiçine bunu yapmak için başka bir uzak durmak olabilirolarak aşağıdaki gibidir:

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

Bu

kesin sorunu çözer. Mutlu kodlar! SearchView Widget İşlem Çubuğu üzerinde olmasa bile çalışır

+0

Yani neredeyse ama benim arama yürütün yoktu gerektiği gibi çökmüş, mükemmel çalıştı ... Benim kod artık şöyle görünür: https://gist.github.com/anonymous/cf26b36c5a22b64459b6 – Mike

+0

Size çünkü var sorgu dinleyicisine iki kez sahip olmak. OnQueryListener uygulamasını sildiğinizden emin olun ve tüm nesneleri (json isteği, vb.) ** aynı sorgu dinleyicisine ** kopyaladığınız yerde kopyalayın/yapıştırın. Yukarıdaki kod içinde size bir sorgu dinleyicisi sağlar. Görüyorsun @Mike? – Fllo

+0

Yukarıdaki güncellenmiş yanıtıma bakın. İsteğinizi dinleyicinin içinde yorumlanmış satırda arayın * "isteğinizi buradan arayın" *.HTH @Mike – Fllo

30

Bir basit bir yolu, aşağıdaki kod şudur:

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

Ve Bir arama yapıldıktan sonra o SearchView çöküşü yapar.

+4

Bu mükemmel çalışıyor! –