Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement search widget in Action Bar Sherlock?

I tried to get Search box to work on Action Bar Sherlock.

This is my 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();         }     } 

This is my 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         }     } 

No success at all. As in, when I type something on the Prelocation Activity and press enter, nothing is being searched. Do I have to treat it as an EditText and write a text listener for that which then calls the geoCoder and gets me the locations or is there a smarter way to go about it?

like image 685
Hick Avatar asked Jul 27 '12 15:07

Hick


People also ask

How to add Search bar in android xml?

To add a SearchView widget to the app bar, create a file named res/menu/options_menu. xml in your project and add the following code to the file. This code defines how to create the search item, such as the icon to use and the title of the item.


1 Answers

Android Support Library(v4 + v7):

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

Google now supports the ActionBar compatibility back to Android 2.1(API 7).

It is easy to make the transition because the method names are the same and/or very similar.

Add the Support Library with Resources: http://developer.android.com/tools/support-library/setup.html#libs-with-res

Your Manifest: AndroidManifest.xml

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

Your 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 [deprecated, use appcompat]:

Here is how to use the standard SearchView and SearchManager in Android with ActionBarSherlock! I am using this code and works fine. I have tested this on Android 2.3(API 10) - Android 4.3(API 18).

Great Tutorial and Documentation:

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

Keep in mind:

Custom Search with ActionBarSherlock(min. API 7)

SearchView with ActionBarSherlock(min. API 8)

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

For Both:

Your Activity: 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);     } 

Let me know if this works for you as well and let me know if you need anymore help!

like image 55
Jared Burrows Avatar answered Oct 02 '22 03:10

Jared Burrows