2012-04-19 10 views
13

Ich versuche, SearchViewCompat mit ActionBarSherlock in einer API 8 App zu verwenden.android.support.v4.widget.SearchViewCompat Beispiel?

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

Bitte beachten Sie, dass sowohl die obere und untere Code muss setActionView() nennen. Bedeutet das, dass eine Suche nicht möglich ist?

+1

Statt Code fragen Sie den Code hinzufügen, können Sie so weit zu Ihrer Frage haben. Vielleicht können Leute Ihnen helfen, Ihr Problem zu beheben. – THelper

+1

Danke THelper. Sieht auch so aus, als wäre mein lokales Dokument veraltet und ich habe ein spezifisches Entwicklerthema gefunden: http://developer.android.com/training/search/backward-compat.html – woodglue

Antwort

2

Was ist das eigentliche Problem? SearchViewCompat wird null für Pre-HC-Geräte zurückgeben, da das Widget SearchView nicht existiert. Dies bedeutet, dass Sie Ihre eigene benutzerdefinierte Aktionsansicht bereitstellen müssen, die HC SearchView imitiert.

Sie können auch die Komponente SearchView aus den Android-Quellen zurückportieren und diese verwenden.

Ansonsten können Sie einfach die vorhandenen Suchschnittstellen von Android verwenden, in diesem Fall für HC + Geräte verwenden Sie die Aktionsansicht, um eine Suche durchzuführen, aber auf Froyo und Gingerbread Geräte klickt der Benutzer auf das Suchsymbol und eine Suchleiste animiert von oben.

Hoffe, das hilft.

+0

Kannst du auf eine Implementierung verweisen, wenn überhaupt? –

6

Wenn Sie die ActionBarSherlock Bibliothek ver 4.2 verwenden, können Sie die API 11 Search Widget mit einem ActionBarSherlock Suche Widget ersetzen, um es rückwärts kompatibel:

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> 

Aktivitätsklasse

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

An einem gewissen Punkt in Ihrer Aktivität:

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

Und dann filtern Sie die Liste Adapter:

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

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

diese Weise Ihre Liste Adapter muss filterbar implementieren.

0

Bessere MenuItemCompat zu verwenden, ich glaube, dies für Sie hilfreich

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