Does somebody know of a tutorial or an example of how to implement the standard Android search interface with Fragment
s? In other words, is it possible to put a standard search with a SearchManager
in a Fragment?

- 21,519
- 75
- 241
- 416

- 156,034
- 29
- 297
- 305
-
Who would you grant the bonus to @blackbelt ?Raghav gave the answer I was looking for. but Alex LockWood also answered to the first part of your question. – Snicolas May 07 '12 at 13:06
-
I accept LockWood's answer. Award the bounty as you like (I think is better) – Blackbelt May 07 '12 at 13:13
-
4I'm glad we ended up getting such a variety of correct answers and workarounds! :) – Alex Lockwood May 07 '12 at 14:25
-
Can anyone give me the answer to this question..? I am stuck here http://stackoverflow.com/questions/10600660/not-able-to-implement-fragmenttabs-properly – Rookie May 28 '12 at 11:16
-
1I'm using this technique to stay within the fragment after adding the SearchView to the actionbar: http://stackoverflow.com/a/6939735/1068167 . My application is not done yet but hopefully it will work. – span Aug 10 '12 at 12:24
-
I have successfully implemented Search in fragments using the Android Search Interface(SearchView in Action Bar) with custom suggestions and displaying of results. Each fragment loads its own suggestions dynamically from the network(cached into a local DB). It took a lot of work, but it works very well. Add a comment if you would like me to give my answer because it will take a lot of explanation.. :-) – Vinay S Shenoy Jan 01 '13 at 09:35
-
go ahead. could be useful for other people. thanks – Blackbelt Jan 01 '13 at 10:47
12 Answers
In short, you can't. There are a couple of reasons why creating a search interface within a Fragment
is not possible.
When creating a searchable interface, you must specify a default "searchable activity" in your Android manifest. As I'm sure you know, a
Fragment
cannot exist without a parentActivity
and thus, this separation is not possible.If you already figured out #1 already, I assume you asked this question in hopes that there is some magical "hack" out there that can get the job done. However, the documentation states that,
When the user executes a search in the search dialog or widget, the system starts your searchable activity and delivers it the search query in an Intent with the ACTION_SEARCH action. Your searchable activity retrieves the query from the intent's QUERY extra, then searches your data and presents the results.
The underlying, internal system that is responsible for providing search results expects an
Activity
, not aFragment
; thus, implementing a search interface that is completely independent of anActivity
is not possible, as it would require changes to the underlying system itself. Check out the source code for theSearchableInfo
class if you don't believe me :).
That being said, it doesn't seem like it would be too difficult to achieve something similar to what you are describing. For instance, you might consider implementing your searchable-Activity so that it will accept the android.intent.action.SEARCH
intent and (instead of immediately displaying the results in a ListView
, for example) will pass the search query to your Fragment
s. For instance, consider the following searchable Activity:
public class SearchableActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Intent.ACTION_SEARCH.equals(getIntent().getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doMySearch(query);
}
}
/**
* Performs a search and passes the results to the container
* Activity that holds your Fragments.
*/
public void doMySearch(String query) {
// TODO: implement this
}
}
When a search-request is made, the system will launch your searchable activity, perform the query, and will pass the results to some container Activity (based on your implementation of doMySearch
). The container Activity will then pass these results to the contained searchable Fragment
, in which the results will be displayed. The implementation requires a bit more work than what you were probably hoping for, but I'm sure there are ways that you can make it more modular, and it seems like this might be the best that you can do.
p.s. If you use this approach, you might have to pay special attention to which Activitys are added/removed to the backstack. See this post for some more information on how this might be done.
p.p.s. You might also forget about the standard search interface completely and just implement a simple search within a Fragment
as described in Raghav's post below.

- 1
- 1

- 83,063
- 39
- 206
- 250
-
@Alex, It's definitely possible to implement the standard Android search interface using fragments. But it takes a LOT of work... :-) – Vinay S Shenoy Jan 01 '13 at 09:50
-
@VinaySShenoy yeah, I mean you'd have to re-implement the entire `SearchManager` for `Fragment`s right? (or something like that) – Alex Lockwood Jan 01 '13 at 17:04
-
1For delivering Search Results, I've implemented something similar to what you suggested, delivering the intent to the Activity which delivers it to the right fragment if it's visible. The toughest part was repopulating the Suggestions Table on fragment load with the right data to let me handle displaying suggestions as well as to handle search submit and clicking on suggestions. But I've got a nice framework in place for future apps now.. :-) – Vinay S Shenoy Jan 02 '13 at 02:07
-
I found this to be a better answer: http://stackoverflow.com/questions/6938952/android-create-custom-searchview-search-action/6939735#6939735 This will allow "searching" from within Fragments. True, it's not the official search mechanism provided by Google, but it works just fine. – Kyle Falconer Aug 05 '13 at 19:19
Here is the example to search something using fragments. Hope it helps and this is what you are looking for:
public class LoaderCursor extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getFragmentManager();
// Create the list fragment and add it as our sole content.
if (fm.findFragmentById(android.R.id.content) == null) {
CursorLoaderListFragment list = new CursorLoaderListFragment();
fm.beginTransaction().add(android.R.id.content, list).commit();
}
}
public static class CursorLoaderListFragment extends ListFragment
implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> {
// This is the Adapter being used to display the list's data.
SimpleCursorAdapter mAdapter;
// If non-null, this is the current filter the user has provided.
String mCurFilter;
@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Give some text to display if there is no data. In a real
// application this would come from a resource.
setEmptyText("No phone numbers");
// We have a menu item to show in action bar.
setHasOptionsMenu(true);
// Create an empty adapter we will use to display the loaded data.
mAdapter = new SimpleCursorAdapter(getActivity(),
android.R.layout.simple_list_item_2, null,
new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
new int[] { android.R.id.text1, android.R.id.text2 }, 0);
setListAdapter(mAdapter);
// Start out with a progress indicator.
setListShown(false);
// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
getLoaderManager().initLoader(0, null, this);
}
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Place an action bar item for searching.
MenuItem item = menu.add("Search");
item.setIcon(android.R.drawable.ic_menu_search);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
SearchView sv = new SearchView(getActivity());
sv.setOnQueryTextListener(this);
item.setActionView(sv);
}
public boolean onQueryTextChange(String newText) {
// Called when the action bar search text has changed. Update
// the search filter, and restart the loader to do a new query
// with this filter.
mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
getLoaderManager().restartLoader(0, null, this);
return true;
}
@Override public boolean onQueryTextSubmit(String query) {
// Don't care about this.
return true;
}
@Override public void onListItemClick(ListView l, View v, int position, long id) {
// Insert desired behavior here.
Log.i("FragmentComplexList", "Item clicked: " + id);
}
// These are the Contacts rows that we will retrieve.
static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
Contacts._ID,
Contacts.DISPLAY_NAME,
Contacts.CONTACT_STATUS,
Contacts.CONTACT_PRESENCE,
Contacts.PHOTO_ID,
Contacts.LOOKUP_KEY,
};
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// This is called when a new Loader needs to be created. This
// sample only has one Loader, so we don't care about the ID.
// First, pick the base URI to use depending on whether we are
// currently filtering.
Uri baseUri;
if (mCurFilter != null) {
baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
Uri.encode(mCurFilter));
} else {
baseUri = Contacts.CONTENT_URI;
}
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
+ Contacts.HAS_PHONE_NUMBER + "=1) AND ("
+ Contacts.DISPLAY_NAME + " != '' ))";
return new CursorLoader(getActivity(), baseUri,
CONTACTS_SUMMARY_PROJECTION, select, null,
Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
mAdapter.swapCursor(data);
// The list should now be shown.
if (isResumed()) {
setListShown(true);
} else {
setListShownNoAnimation(true);
}
}
public void onLoaderReset(Loader<Cursor> loader) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
mAdapter.swapCursor(null);
}
}
}

- 83,063
- 39
- 206
- 250

- 8,660
- 17
- 58
- 91
-
The OP asked for "standard search interface", but this does achieve a simple "search" within a `Fragment` so I wouldn't complain. Congrats! :P – Alex Lockwood May 07 '12 at 14:18
-
31Next time you might want to [**cite your sources**](http://developer.android.com/reference/android/app/LoaderManager.html). – Adrian Monk May 07 '12 at 14:40
-
See [**creating a search interface**](http://developer.android.com/guide/topics/search/search-dialog.html) on the developer's site. The OP asked if it was possible to create a "searchable-Fragment" that works with the standard Android search as described in the documentation. – Alex Lockwood May 07 '12 at 16:38
-
Some pitfalls: 1-Using a customized search icon doesn't work. 2-SearchView needs to have some management code, like for disabling the content, handling back, etc. – AlikElzin-kilaka May 02 '13 at 15:08
-
It is quite possible to search in a fragment using the standard ActionBar SearchView ActionView API. This will work back to Android 2.1 (API level 7) too using AppCompat support classes v7.
In your fragment:
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater){
inflater.inflate(R.menu.search, menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView sv = new SearchView(((YourActivity) getActivity()).getSupportActionBar().getThemedContext());
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
MenuItemCompat.setActionView(item, sv);
sv.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
System.out.println("search query submit");
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
System.out.println("tap");
return false;
}
});
}
In your menu XML
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="Search Waste Items"
android:showAsAction="ifRoom|collapseActionView"
nz.govt.app:actionViewClass="android.support.v7.widget.SearchView"
nz.govt.app:showAsAction="ifRoom|collapseActionView" />

- 5,203
- 2
- 16
- 17
-
-
-
1reading the accepted answer, i lost hope..the other answers are complex, i read your answer!!! So simple! thats it...thank you so much – MBH Sep 02 '15 at 06:26
-
that works well, thanks! Do you have any advices about Recent Query Suggestions implementation? – hornet2319 Oct 06 '15 at 15:09
-
2I think we have to add setHasOptionsMenu(true) in onActivityCreated. As spotted by @MBH. – Raymond Lukanta Jan 11 '16 at 09:17
-
@RaymondLukanta is right - but I added setHasOptionsMenu(true) in the fragment's onCreate method. – MorZa Jan 12 '16 at 11:40
-
-
It still depends on `Activity`. You have to set `theme` which supports `ActionBar` on it. – klimat Jun 01 '16 at 06:39
-
`MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItemCompat.setActionView(item, sv);` this are the lines are deprecated please help me in this case bro – Gowthaman M Nov 04 '17 at 19:46
-
2@GowthamanM Just use MenuItem.SHOW_AS_ACTION.... if you are able the AppCompat is deprecated on later APIs – David Feb 08 '18 at 02:38
-
1Hey @GowthamanM, use like this: `item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM); item.setActionView(searchView);` – Rod Lima Dec 14 '18 at 04:12
Using AppCompat support classes v7. Just adding something to @David 's solution from @Rookie solution to get it work properly in a simple manner, here is my fragment code:
MyFragment:
public class MyFragment extends Fragment implements SearchView.OnQueryTextListener {
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// What i have added is this
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
//inflater.inflate(R.menu.main, menu); // removed to not double the menu items
MenuItem item = menu.findItem(R.id.action_search);
SearchView sv = new SearchView(((MainActivity) getActivity()).getSupportActionBar().getThemedContext());
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
MenuItemCompat.setActionView(item, sv);
sv.setOnQueryTextListener(this);
sv.setIconifiedByDefault(false);
sv.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Utils.LogDebug("Clicked: ");
}
});
MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
Utils.LogDebug("Closed: ");
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
Utils.LogDebug("Openeed: ");
return true; // Return true to expand action view
}
});
super.onCreateOptionsMenu(menu,inflater);
}
@Override
public boolean onQueryTextSubmit(String query) {
Utils.LogDebug("Submitted: "+query);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
Utils.LogDebug("Changed: "+newText);
return false;
}
}
I added the onActivityCreated
, cuz without calling setHasOptionsMenu(true);
the system will not know that this fragment needs to interact with the menu.
then I removed the line inflater.inflate(R.menu.main, menu);
because it doubled the menu items since Activity inflated a menu, then Fragment inflated another menu
Thanks to @David and @Rookie

- 16,271
- 19
- 99
- 149
When working with Fragments
you still need to use an Activity
to control and assign the Fragments
.
This Activity
can have search functionality as before.
I've recently switched from a 'normal' Activity
based app, to a Fragment
based app and the search functionality worked just the same for me.
Have you tried working on it, and didn't succeed? If so give some more detail in your question.
EDIT:
If you want to have a fragment specific search, have all your Fragments
extend an interface MyFragment
with a startSearch
method, and have your Activity
's startSearch
method call the current fragment's startSearch
method.

- 83,063
- 39
- 206
- 250

- 27,641
- 11
- 107
- 150
-
Requirement was that the android search was bounded to the specific fragment, not to the activity. So, no I had not tried it. – Blackbelt May 03 '12 at 07:54
-
I haven't tried it yet, but this sounds like EXACTLY what I'm looking for. I have a navigation drawer with fragments that each contain unrelated search features. I don't want to bypass the android search system entirely, so I needed something like this. – Bassinator Nov 30 '17 at 21:30
I think I achieved it : you can actually use fragments and add a search icon to an action bar so that a search is possible inside the fragments. The trick is to use an action bar, an action view, a listener for it, a loader and an adapter of course.
This works pretty well although it completely bypasses the android platform search mechanism (but it could be completed with some work to find what @Alex Lockwood describes and pass the search to fragments). It would not react to an intent as expected in the case of an activity, but it works : users can search inside fragments.
Here is the code :
SearchInFragmentActivity
package com.sof.test.searchfragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.ActionBar.TabListener;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.sof.test.searchfragment.SearchFragment;
import com.sof.test.R;
public class SearchInFragmentActivity extends SherlockFragmentActivity implements TabListener {
private SearchFragment tab1 = new SearchFragment();
private SearchFragment tab2 = new SearchFragment();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.search_in_fragments );
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
createTab( R.string.tab1, R.drawable.ic_menu_search );
createTab( R.string.tab2, R.drawable.ic_menu_search );
getSupportActionBar().setSelectedNavigationItem( 0 );
invalidateOptionsMenu();
}
private void createTab(int tabNameResId, int tabIconResId) {
ActionBar.Tab tab = getSupportActionBar().newTab();
tab.setText( tabNameResId );
tab.setTabListener(this);
getSupportActionBar().addTab(tab);
}// met
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if( ft == null ) {
return;
}//if
View fragmentSlot = findViewById( R.id.fragment );
Fragment newFragment = null;
if( fragmentSlot != null ) {
newFragment = (tab.getPosition() == 0) ? tab1 : tab2;
ft.replace(R.id.fragment, newFragment );
ft.setTransition( FragmentTransaction.TRANSIT_FRAGMENT_FADE);
}//if
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}//class
The fragment class SearchFragment (I use 2 instances inside the activity above).
package com.sof.test.searchfragment;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.SearchView;
import android.widget.TextView;
import com.sof.test.R;
import com.actionbarsherlock.app.SherlockListFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
public class SearchFragment extends SherlockListFragment {
private StringLoader loader = null;
private StringAdapter adapter = null;
private List<String> listData = new ArrayList<String>();
private String query;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
createListData();
loader = new StringLoader( getActivity(), this );
adapter = new StringAdapter(listData);
setListAdapter(adapter);
getLoaderManager().initLoader(0, null, new LoaderCallBacks() );
loader.forceLoad();
setHasOptionsMenu( true );
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater ) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate( R.menu.menu_search, menu);
System.out.println( "inflating menu");
final SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
showFilteredItems( newText );
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
};
searchView.setOnQueryTextListener(queryTextListener);
return;
}//met
private void showFilteredItems( String query ) {
this.query = query;
loader.onContentChanged();
}
private void createListData() {
for( int i = 0; i < 100 ; i ++ ) {
listData.add( "String "+ i );
}
}
public List<String> getData() {
List<String> listFilteredData = new ArrayList<String>();
for( String string : listData ) {
if( query == null || string.contains( query ) ) {
listFilteredData.add( string );
}
}
return listFilteredData;
}//met
private class LoaderCallBacks implements LoaderCallbacks< List<String>> {
@Override
public void onLoadFinished(Loader<List<String>> loader,
List<String> listData) {
adapter.setListData( listData );
}// met
@Override
public void onLoaderReset(Loader<List<String>> listData) {
adapter.setListData( new ArrayList<String>() );
}// met
@Override
public Loader<List<String>> onCreateLoader(int arg0,
Bundle arg1) {
return loader;
}// met
}//class
private class StringAdapter extends ArrayAdapter< String > {
private List<String> listDataToDisplay = new ArrayList<String>();
private LayoutInflater mInflater;
public StringAdapter( List<String> listData ) {
super( getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, listData );
listDataToDisplay = listData;
mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}//cons
private void setListData( List<String> newListData ) {
this.listDataToDisplay.clear();
this.listDataToDisplay.addAll( newListData );
notifyDataSetChanged();
}//met
/**
* Populate new items in the list.
*/
@Override public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
view = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
} else {
view = convertView;
}
((TextView)view.findViewById( android.R.id.text1)).setText( listDataToDisplay.get( position ) );
return view;
}
}//inner class
}//class
class StringLoader extends AsyncTaskLoader<List<String>> {
SearchFragment fragment = null;
public StringLoader(Context context, SearchFragment fragment) {
super(context);
this.fragment = fragment;
}// cons
@Override
public List<String> loadInBackground() {
return fragment.getData();
}// met
}// class
The xml file for the menu of the search fragments res/menu/menu_search.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="horizontal" >
<FrameLayout
android:id="@+id/fragment"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
And the xml layout file res/layout/search_in_fragments.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="horizontal" >
<FrameLayout
android:id="@+id/fragment"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>

- 37,840
- 15
- 114
- 173
-
I'd also like to point out that Jake Wharton decided not to implement the `SearchView` for his ActionBarSherlock library due to its complexity ([**see his comment here**](http://stackoverflow.com/questions/8971776/android-action-sherlock-searchview#comment11344311_8998824)). As you can see (and as I described in my answer as well), Android's search implementation is anything but trivial... it is ingrained in the underlying system, and this makes even 3rd party libraries difficult to write (and that's saying something... Jake Wharton is like the Chuck Norris of 3rd party libraries! :D). – Alex Lockwood May 07 '12 at 14:52
-
Take a look at the [`SearchView.java`](http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.0.3_r1/android/widget/SearchView.java/?v=source) source code here. – Alex Lockwood May 07 '12 at 14:57
-
2Alex, it seems Jake Wharton changed his mind: https://twitter.com/JakeWharton/status/221169921235755009 – Jose_GD Jul 07 '12 at 14:28
-
-
Use the ActionBar
and SearchView
. You will be able to handle searches without any connection to Activity. Just set an OnQueryTextListener
to the SearchView.
MenuItem item = menu.add("Search");
SearchView sv = new SearchView(getActionBar().getThemedContext());
item.setActionView(sv);
item.setIcon(R.drawable.ic_search);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
| MenuItem.SHOW_AS_ACTION_IF_ROOM);
sv.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
//...
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//...
return false;
}
});
See this post for more details on custom search.

- 1
- 1

- 34,335
- 35
- 194
- 277
others solution..... i dont like that. This more easy for me.But its my idea.Im waiting yours opinion
public interface SearchImpl {
public void searchQuery(String val);
}
Fragment
public class MyFragment extends Fragment implements SearchImpl {
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_almanca, container, false);
return view;
}
@Override
public void searchQuery(String val) {
Log.e("getted", val);
}
}
Acitivty
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Log.e("setted", "" + query);
try {
MyFragment myFGM=new MyFragment();
myFGM.searchQuery(query);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return super.onCreateOptionsMenu(menu);
}

- 1,946
- 1
- 27
- 46

- 526
- 4
- 18
A Fragment
cannot exist outside an Activity
, nor can a Fragment
be linked to a android.intent.action.SEARCH
or any other intent-filter
.
So without using an Activity
to wrap the the Fragment
, what you're asking is not possible.

- 11,401
- 5
- 28
- 37
In case of Fragments into a ViewPager, I could do it by blocking the search button when I'm not on the fragment where I want to give a search bar. Into the activity:
@Override
public boolean onSearchRequested() {
if (mPager.getCurrentItem() == mAdapter.getPosition(FragmentType.VIDEO))
return super.onSearchRequested();
else
return false;
}
And in case of no physical search button, I added an action item into the fragment, which trigger this code:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.search_item) {
return getSherlockActivity().onSearchRequested();
}
return super.onOptionsItemSelected(item);
}

- 3,279
- 2
- 34
- 46
i found a work around :) you can override this method (startActivity(Intent) ) in your BaseActivity and then check if the action is ACTION_SEARCH then do your special job :D
@Override
public void startActivity(Intent intent) {
try {
if (intent.getAction().equals(Intent.ACTION_SEARCH))
toast("hello");
} catch (Exception e) {
}
}

- 144
- 1
- 6
yes its possible,
please implements Search view on your Activity ,'onQueryTextChange' in Activity will also listen the search in fragment, you can check the fragment visibility in 'onQueryTextChange' , if it visible you can call your search method for fragment, its working perfect in my code

- 1,132
- 13
- 17