2012-04-19 16 views
13

Estoy tratando de usar SearchViewCompat con ActionBarSherlock en una aplicación API 8.android.support.v4.widget.SearchViewCompat ejemplo?

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuItem item = menu.add("Search") 
     .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search) 
     .setActionView(R.layout.collapsible_edittext); 
    item.setShowAsAction(
     MenuItem.SHOW_AS_ACTION_ALWAYS | 
     MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

    // To use SearchViewCompat, I need to add it to the Menu item as well: 
    View searchView = SearchViewCompat.newSearchView(this); 
    // ... 
    SearchViewCompat.setOnQueryTextListener(...); 
    // ... 
    item.setActionView(searchView); 

Tenga en cuenta que la parte superior e inferior de código tiene que llamar setActionView(). ¿Eso significa que no es posible hacer una búsqueda?

+1

En lugar de pedir código que puede agregar el código que tienes hasta ahora a su pregunta. Tal vez las personas pueden ayudarlo a solucionar su problema. – THelper

+1

Gracias THelper. También parece que mi documento local está desactualizado y encontré un tema específico para el desarrollador: http://developer.android.com/training/search/backward-compat.html – woodglue

Respuesta

2

¿Cuál es el problema real? SearchViewCompat devolverá null para dispositivos pre-HC ya que el widget SearchView no existe. Esto significa que tendrá que proporcionar su propia vista de acción personalizada que imita el HC SearchView.

También puede respaldar el componente SearchView de las fuentes de Android y usarlo. De lo contrario, puede usar las interfaces de búsqueda existentes que tiene Android, en cuyo caso para dispositivos HC + usa la vista de acción para realizar una búsqueda desde la parte superior.

Espero que esto ayude.

+0

¿Puede indicar una implementación, si corresponde? –

6

Si está utilizando la Biblioteca ActionBarSherlock ver 4.2, puede reemplazar la API 11 SearchView Widget con un SearchView Widget ActionBarSherlock para que sea compatible con versiones anteriores:

search.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/menu_search" 
     android:icon="@drawable/ic_action_search" 
     android:title="@string/description_search" 
     android:orderInCategory="0" 
     android:actionViewClass="com.actionbarsherlock.widget.SearchView" 
     android:showAsAction="ifRoom|collapseActionView" /> 
</menu> 

Actividad clase

//IMPORTANT!!! 
import com.actionbarsherlock.widget.SearchView; 

.. .

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getSupportMenuInflater().inflate(R.menu.search, menu); 
    setupSearchMenuItem(menu); 
    return true; 
} 

private void setupSearchMenuItem(Menu menu) { 
    MenuItem searchItem = menu.findItem(R.id.menu_search); 
    if (searchItem != null) { 
     SearchView searchView = (SearchView) searchItem.getActionView(); 
     if (searchView != null) { 
      SearchManager searchManager = 
       (SearchManager) getSystemService(SEARCH_SERVICE); 
      searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 
      } 
     } 
    } 
} 
2

En algún momento de su actividad:

public class HomeActivity extends SherlockFragmentActivity implements 
    SearchView.OnQueryTextListener { 

// ...  
SearchView searchView = (com.actionbarsherlock.widget.SearchView) 
    actionBarCustom.findViewById(R.id.search); 
SearchManager sm = (SearchManager)getSystemService(SEARCH_SERVICE); 
searchView.setSearchableInfo(sm.getSearchableInfo(getComponentName())); 
searchView.setSubmitButtonEnabled(true); 
searchView.setOnQueryTextListener(this); 

y luego filtrar el adaptador de la lista:

@Override 
public boolean onQueryTextSubmit(String query) { 
    return true; 
} 

@Override 
public boolean onQueryTextChange(String newText) { 
    mAdapter.getFilter().filter(newText.trim()); 
    return false; 
} 

De esta manera, el adaptador de la lista debe implementar filtrable.

0

mejor utilizar MenuItemCompat, creo que esto es útil para usted

getMenuInflater().inflate(R.menu.main, menu); 
    MenuItem searchItem = menu.findItem(R.id.search); 
    SearchManager searchManager =(SearchManager)getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem); 
    SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); 
    searchView.setSearchableInfo(info);