¿Alguien sabe de un tutorial o un ejemplo de cómo implementar el estándar Android interfaz de búsqueda con Fragments? En otras palabras, es posible poner una búsqueda estándar con un SearchManager en un Fragmento?

  • ¿A quién le conceda el bono a @blackbelt ?Raghav dio la respuesta que estaba buscando. pero Alex LockWood también respondió a la primera parte de su pregunta.
  • Acepto LockWood la respuesta. Premio de la recompensa como te gusta (creo que es mejor)
  • Me alegro de que acabó siendo una gran variedad de respuestas correctas y soluciones! 🙂
  • Puede alguien darme la respuesta a esta pregunta..? Estoy atascado aquí stackoverflow.com/questions/10600660/…
  • Yo estoy usando esta técnica para permanecer dentro del fragmento después de la adición de la SearchView a la actionbar: stackoverflow.com/a/6939735/1068167 . Mi aplicación no está hecho todavía, pero espero que funcione.
  • Me han implementado con éxito la Búsqueda de los fragmentos de usar Android Interfaz de Búsqueda(SearchView en la Barra de Acción) con la costumbre de sugerencias y la visualización de los resultados. Cada fragmento de las cargas de sus propias sugerencias de forma dinámica a partir de la red(almacenamiento en caché en una base de datos local). Tomó un montón de trabajo, pero funciona muy bien. Añadir un comentario si que me gustaría dar mi respuesta, porque va a tomar un montón de explicación.. 🙂
  • vaya por delante. podría ser útil para otras personas. gracias

InformationsquelleAutor Blackbelt | 2011-08-29

12 Comentarios

  1. 87

    En resumen, no se puede. Hay un par de razones por las que la creación de una interfaz de búsqueda dentro de un Fragment no es posible.

    1. A la hora de crear una interfaz de búsqueda, usted debe especificar un valor predeterminado de «búsqueda de la actividad» en su manifiesto de Android. Como estoy seguro que usted sabe, un Fragment no puede existir sin un padre Activity y por lo tanto, esta separación no es posible.

    2. Si usted ya averiguado #1 ya, supongo que esta pregunta con la esperanza de que hay algo de mágico «hack» por ahí que puede hacer el trabajo. Sin embargo, la documentación indica que,

      Cuando el usuario ejecuta una búsqueda en el cuadro de diálogo de búsqueda o un widget, el
      el sistema comienza su búsqueda de la actividad y entrega la búsqueda
      consulta en la Intención con la ACTION_SEARCH acción. Su búsqueda
      la actividad se recupera la consulta de la intención de la CONSULTA extra, entonces
      las búsquedas de los datos y presenta los resultados.

      El subyacente, sistema interno que es responsable de proporcionar resultados de búsqueda, espera un Activity, no Fragment; por lo tanto, la implementación de una interfaz de búsqueda que es completamente independiente de un Activity no es posible, como se requeriría de cambios en el subyacente propio sistema. Echa un vistazo al código fuente de los SearchableInfo clase si no me creen :).

    Que se dice, parece que no sería demasiado difícil de lograr algo similar a lo que usted está describiendo. Por ejemplo, usted podría considerar la posibilidad de implementar su búsqueda-Actividad, por lo que aceptarán el android.intent.action.SEARCH intención y (en lugar de inmediatamente mostrar los resultados en una ListView, por ejemplo) va a pasar a la consulta de búsqueda a su Fragments. Por ejemplo, considere la siguiente Actividad de búsqueda:

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

    Cuando la búsqueda se hace la solicitud, el sistema iniciará su actividad de búsqueda, realice la consulta, y pasar los resultados a algún contenedor de Actividad (basado en la implementación de doMySearch). El contenedor de la Actividad, a continuación, pasar estos resultados a los contenidos de búsqueda Fragment, en el que los resultados serán mostrados. La aplicación requiere un poco más de trabajo de lo que probablemente se esperaba, pero estoy seguro de que hay maneras que usted puede hacer que sea más modular, y parece que este podría ser el mejor que usted puede hacer.

    p.s. Si utiliza este método, usted podría tener que prestar especial atención a que Actividades se añaden/quitan a la backstack. Ver este post para más información sobre cómo se podría hacer esto.

    p.p.s. También puede olvidarse de que el estándar de la interfaz de búsqueda completo y sólo aplicar una simple búsqueda dentro de un Fragment como se describe en Raghav del post de abajo.

    • Definitivamente, es posible implementar el estándar de Android interfaz de búsqueda utilizando fragmentos. Pero se necesita un MONTÓN de trabajo… 🙂
    • sí, me refiero a que tendría que volver a implementar la totalidad de la SearchManager para Fragments a la derecha? (o algo así)
    • Para la entrega de Resultados de Búsqueda, he implementado algo similar a lo que usted sugiere, a la entrega de la intención de la Actividad que se entrega a la derecha fragmento si es visible. La parte más dura fue la repoblación de la Tabla Sugerencias de los fragmentos de carga con los datos correctos para que me deje manejar la visualización de sugerencias, así como para manejar botón de búsqueda y haga clic en sugerencias. Pero tengo un buen marco para futuras aplicaciones ahora.. 🙂
    • He encontrado esto para ser una mejor respuesta: stackoverflow.com/questions/6938952/… Esto permitirá a la «búsqueda» de dentro de los Fragmentos. Es cierto, no es la oficial mecanismo de búsqueda proporcionado por Google, pero funciona muy bien.
  2. 76

    Aquí está el ejemplo para buscar algo a través de fragmentos. Espero que ayude y esto es lo que están buscando:

    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);
    }
    }
    }
    • El OP le pidió «estándar de interfaz de búsqueda», pero esto no lograr un simple «buscar» dentro de un Fragment así que no se quejan. Felicidades! 😛
    • La próxima vez que desee cite sus fuentes.
    • Consulte la creación de una interfaz de búsqueda en el sitio del desarrollador. El OP se le preguntó si era posible crear una «búsqueda-Fragmento de» que trabaja con el estándar de Android de búsqueda como se describe en la documentación.
    • Algunas de las dificultades: 1-Mediante una búsqueda personalizada icono no funciona. 2-SearchView necesita tener un poco de código de administración, como para la desactivación de los contenidos, el manejo de espalda, etc.
    • En mi caso onQueryTextChange método no está siendo llamado.
  3. 55

    Es muy posible que la búsqueda en un fragmento con el estándar del ActionBar SearchView ActionView de la API. Esto va a funcionar de nuevo a Android 2.1 (a nivel de API 7) utilizando también AppCompat clases de apoyo para la v7.

    En su fragmento:

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

    En su menú 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" />
    • Esto funciona muy bien con el nuevo ActionBarActivity appcompat v7, gracias
    • Necesita usted una Búsqueda Manager?
    • la lectura de la aceptó contestar, he perdido la esperanza..las otras respuestas son complejas, leí tu respuesta!!! Así de simple!!! eso es todo…muchas gracias
    • que funciona bien, gracias! ¿Tienes alguna consejos acerca de las Recientes Sugerencias de Consulta aplicación?
    • Creo que tenemos que añadir setHasOptionsMenu(true) en onActivityCreated. Como manchada por @MBH.
    • es de derecha, pero he añadido setHasOptionsMenu(true) en el fragmento del método onCreate.
    • soy yo el único que se duplica el resultado de onQuertTextSubmit?
    • Todavía depende de Activity. Usted tiene que fijar theme que apoya ActionBar en él.
    • MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); MenuItemCompat.setActionView(item, sv); esto son las líneas que están en desuso por favor me ayude en este caso bro
    • Sólo uso MenuItem.SHOW_AS_ACTION…. si usted es capaz de la AppCompat es obsoleto en adelante Api
    • Hey @GowthamanM, uso como esta: item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM); item.setActionView(searchView);

  4. 14

    Utilizando AppCompat clases de apoyo para la v7. Sólo añadir algo a @David ‘s solución de @Novato solución para conseguir que funcione correctamente en una forma simple, aquí está mi fragmento de código:

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

    He añadido el onActivityCreated, porque sin llamar setHasOptionsMenu(true); el sistema no sabrá que este fragmento necesita interactuar con el menú.

    luego me quitó la línea de inflater.inflate(R.menu.main, menu); porque duplicaba los elementos de menú desde la Actividad de inflado de un menú, a continuación, el Fragmento de inflado otro menú

    Gracias a @David y @Novato

  5. 7

    Cuando se trabaja con Fragments usted todavía necesita usar un Activity para controlar y asignar la Fragments.
    Este Activity puede tener la funcionalidad de búsqueda como antes.

    He cambiado recientemente de un ‘normal’ Activity base de la aplicación, a un Fragment basado en la aplicación y la funcionalidad de búsqueda trabajado de la misma para mí.

    ¿Has probado a trabajar en él, y no tuvo éxito? Si es así darle un poco más de detalle en su pregunta.

    EDICIÓN:

    Si quieres tener un fragmento de búsqueda específico, tiene todos sus Fragments ampliar una interfaz MyFragment con un startSearch método, y tiene su Activity‘s startSearch llamada al método de la corriente del fragmento startSearch método.

    • El requisito era que el android de búsqueda fue limitada al fragmento específico, no a la actividad. Así que, no, yo no lo había probado.
    • Yo no lo he probado aún, pero esto suena como EXACTAMENTE lo que estoy buscando. Tengo un cajón de navegación con los fragmentos que contienen cada uno relacionado las características de búsqueda. No quiero omitir el android sistema de búsqueda completo, así que necesitaba algo como esto.
  6. 5

    Creo que lo logra : usted puede utilizar realmente fragmentos y agregar un icono de búsqueda a una barra de acción, de modo que una búsqueda es posible dentro de los fragmentos. El truco es usar una barra de acción, una acción vista, un oyente, un cargador y un adaptador de curso.

    Esto funciona bastante bien, aunque se omite completamente la plataforma android mecanismo de búsqueda (pero podría ser completado con un poco de trabajo para encontrar lo que @Alex Lockwood describe y pasar a la búsqueda de los fragmentos). No iba a responder a una intención como se esperaba en el caso de una actividad, pero funciona : los usuarios pueden buscar en el interior de los fragmentos.

    Aquí está el código :

    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

    El fragmento de la clase SearchFragment (yo uso 2 instancias dentro de la actividad anterior).

    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

    El archivo xml para el menú de la búsqueda de los fragmentos de 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>

    Y el fichero xml de diseño 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>
    • También me gustaría señalar que Jake Wharton decidió no implementar el SearchView para su ActionBarSherlock de la biblioteca, debido a su complejidad (ver su comentario aquí). Como se puede ver (y como he descrito en mi respuesta así), Android de búsqueda de la aplicación es cualquier cosa menos trivial… que está arraigada en el sistema subyacente, y esto hace que incluso la 3ª parte de las bibliotecas difícil de escribir (y eso es decir algo… Jake Wharton es como el Chuck Norris de la 3ª parte de las bibliotecas! :D).
    • Echa un vistazo a la SearchView.java código fuente aquí.
    • Alex, parece que Jake Wharton cambió de opinión: twitter.com/JakeWharton/status/221169921235755009
    • Son ambos de estos archivos xml de la misma?
    • parece que son. Honestamente, después de 2 años no puedo decir
  7. 5

    Utilizar el ActionBar y SearchView. Usted será capaz de manejar las búsquedas sin conexión alguna con la Actividad. Acaba de establecer un OnQueryTextListener a la 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;
    }
    });

    Ver este post para más detalles sobre la búsqueda personalizada.

  8. 2

    otros de la solución….. no me gusta eso.
    Esto más fácil para mí.Pero es mi idea.Im esperando el tuyo opinión

    public interface SearchImpl {
    public void searchQuery(String val);
    }

    Fragmento

    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);
    }
  9. 1

    Un Fragment no puede existir fuera de un Activity, ni Fragment estar vinculado a un android.intent.action.SEARCH o cualquier otro intent-filter.

    Así, sin el uso de un Activity para envolver el Fragment, lo que estamos pidiendo no es posible.

  10. 1

    En el caso de los Fragmentos en un ViewPager, yo podría hacerlo por el bloqueo del botón de búsqueda cuando no estoy en el fragmento donde quiero dar a una barra de búsqueda. En la actividad:

    @Override
    public boolean onSearchRequested() {
    if (mPager.getCurrentItem() == mAdapter.getPosition(FragmentType.VIDEO))
    return super.onSearchRequested();
    else
    return false;
    }

    Y en caso de no física botón de búsqueda, he añadido un elemento de acción en el fragmento, que desencadenan este código:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.search_item) {
    return getSherlockActivity().onSearchRequested();
    }
    return super.onOptionsItemSelected(item);
    }
  11. 1

    he encontrado un trabajo de todo 🙂
    puede invalidar este método (startActivity(Intent) ) en su BaseActivity y, a continuación, comprobar si la acción es ACTION_SEARCH a continuación, hacer su trabajo especial 😀

    @Override
    public void startActivity(Intent intent) {
    try {
    if (intent.getAction().equals(Intent.ACTION_SEARCH))
    toast("hello");
    } catch (Exception e) {
    }
    }
  12. 0

    sí, es posible,

    por favor implementa la vista de Búsqueda en su Actividad, «onQueryTextChange’ en la Actividad también escuchar la búsqueda en el fragmento, se puede comprobar el fragmento de la visibilidad en ‘onQueryTextChange», si es visible, usted puede llamar a su método de búsqueda por fragmento, su trabajo perfecto en mi código

Dejar respuesta

Please enter your comment!
Please enter your name here