如何在Action Bar Sherlock中实现search小部件?

我试图让search框在Action Sherlock上工作。

这是我的PreLocationActivity

  @ContentView(R.layout.search) public class PreLocationActivity extends RoboSherlockActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.map_layout); } @Override public boolean onCreateOptionsMenu(Menu menu) { //Used to put dark icons on light action bar menu.add("Search") .setIcon(R.drawable.ic_search_inverse) .setActionView(R.layout.collapsible_edittext) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); return true; } @Override public boolean onSearchRequested() { return super.onSearchRequested(); } } 

这是我的SearchableActivity

 @ContentView(R.layout.search) public class SearchableActivity extends RoboSherlockFragmentActivity { @InjectView(R.id.addressListView) ListView addressView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get the intent, verify the action and get the query Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doGeoSearch(query); } } public void doGeoSearch(String query){ Geocoder geocoder; ArrayList<Address> addresses; ArrayList<String> address = new ArrayList<String>() ; geocoder = new Geocoder(this, Locale.getDefault()); try { addresses = (ArrayList<Address>) geocoder.getFromLocationName(query, 6); Log.d("Address",String.valueOf(addresses)); for(int i = 0;i<addresses.size();i++) { String addr = new String(); addr.concat(addresses.get(i).getAddressLine(0)); addr.concat(addresses.get(i).getAddressLine(1)); addr = addresses.get(i).getAddressLine(0) + addresses.get(i).getLocality() + addresses.get(i).getAdminArea(); //addr.concat(addresses.get(i).getAddressLine(2)); Log.d("addr",addr); address.add(addr); } SearchAddressAdapater addressList = new SearchAddressAdapater(getApplicationContext(),R.layout.search_list,addresses, SearchableActivity.this); addressView.setAdapter(addressList); //ListView addressListView = new ListView(); } catch (IOException e) { //Handle exception } } 

没有成功。 正如在我inputPrelocation Activity上的东西并按回车键时,没有任何东西在被search。 我是否必须将其作为EditText对待,然后为此编写一个文本侦听器,然后调用geoCoder并将位置告诉我,或者有更智能的方法来处理它?

Solutions Collecting From Web of "如何在Action Bar Sherlock中实现search小部件?"

 private EditText search; public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) { menu.add(0, 1, 1, R.string.menu_search).setIcon(R.drawable.ic_action_search).setActionView(R.layout.action_search).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) { switch (item.getItemId()) { case 1: search = (EditText) item.getActionView(); search.addTextChangedListener(filterTextWatcher); search.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); } } private TextWatcher filterTextWatcher = new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { // your search logic here } }; 

Android支持库(v4 + v7):

Support Library v7: http : //developer.android.com/tools/support-library/features.html#v7-appcompat

Google现在支持将ActionBar兼容到Android 2.1(API 7)。

由于方法名称相同和/或非常相似,所以很容易进行转换。

使用资源添加支持库: http : //developer.android.com/tools/support-library/setup.html#libs-with-res

你的清单:AndroidManifest.xml

 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="17" /> 

你的Menu:menu.xml

 <item android:id="@+id/menu_search" android:actionViewClass="android.support.v7.widget.SearchView" android:icon="@drawable/ic_action_search" android:showAsAction="ifRoom|collapseActionView" android:title="Search"/> 

ActionBarSherlock [已弃用,使用appcompat]:

这里是如何在Android中使用标准的SearchView和SearchManager和ActionBarSherlock! 我正在使用此代码,并正常工作。 我已经testing了Android 2.3(API 10) – Android 4.3(API 18)。

伟大的教程和文档:

http://developer.samsung.com/android/technical-docs/UI-unification-with-older-Android-versions-using-ActionBarSherlock

记住:

使用ActionBarSherlock进行自定义search(分钟API 7)

SearchView与ActionBarSherlock(分钟API 8)

你的Menu:menu.xml

 <item android:id="@+id/menu_search" android:actionViewClass="com.actionbarsherlock.widget.SearchView" android:icon="@drawable/ic_action_search" android:showAsAction="ifRoom|collapseActionView" android:title="Search"/> 

对彼此而言:

您的活动:MainActivity.java

 public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); if (null != searchView ) { searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); } SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { public boolean onQueryTextChange(String newText) { // this is your adapter that will be filtered adapter.getFilter().filter(newText); return true; } public boolean onQueryTextSubmit(String query) { // this is your adapter that will be filtered adapter.getFilter().filter(query); return true; } }; searchView.setOnQueryTextListener(queryTextListener); return super.onCreateOptionsMenu(menu); } 

让我知道这是否也适用于你,让我知道如果你需要更多的帮助!

在这里有一个类似的问题,我有问题分配适配器。

如何使用SherlockActionbar实现与ListView的search小部件?

我希望这会有帮助,因为我有同样的问题。

要使用适配器,最好的方法是该类实现SearchView.OnQueryTextListener,然后不必创build内部类,并且您将拥有适配器。

在你的代码将是:

 public class MainActivity extends SherlockListActivity implements SearchView.OnQueryTextListener 

然后在课堂上你必须定义方法。 适配器将是您的类ArrayAdapter适配器中的适配器。 但是你应该把它定义为课堂上的私人。

 public boolean onQueryTextChange(String newText) { // this is your adapter that will be filtered adapter.getFilter().filter(newText); return true; } public boolean onQueryTextSubmit(String query) { // this is your adapter that will be filtered adapter.getFilter().filter(query); return true; } 

在你正在设置的行中:

  searchView.setOnQueryTextListener(queryTextListener); 

应该:

  searchView.setOnQueryTextListener(this); 

如果您有任何问题,请告诉我,我今天遇到了类似的问题,并且没有回答您的问题。