web-dev-qa-db-fra.com

Recherche Android avec Fragments

Est-ce que quelqu'un connaît un tutoriel ou un exemple sur la façon de mettre en œuvre l'interface de recherche standard Android avec Fragments? En d'autres termes, est-il possible de mettre une recherche standard avec un SearchManager dans un fragment?

154
Blackbelt

En bref, vous ne pouvez pas. Il y a plusieurs raisons pour lesquelles la création d'une interface de recherche dans une variable Fragment n'est pas possible.

  1. Lors de la création d'une interface de recherche, vous devez spécifier une "activité de recherche" par défaut dans votre manifeste Android. Comme vous le savez sans doute, une Fragment ne peut exister sans un parent Activity et, par conséquent, cette séparation n'est pas possible.

  2. Si vous avez déjà compris # 1 déjà, je suppose que vous avez posé cette question dans l'espoir qu'il existe un "bidouillage" magique capable de faire le travail. Cependant, la documentation indique que,

    Lorsque l'utilisateur exécute une recherche dans la boîte de dialogue ou le widget de recherche, le fichier Le système démarre votre activité de recherche et la transmet à la recherche requête dans une intention avec l'action ACTION_SEARCH. Votre consultable activity récupère la requête à partir de QUERY extra de l'intention, puis recherche vos données et présente les résultats.

    Le système interne sous-jacent responsable de la fourniture des résultats de recherche s'attend à une Activity et non à une Fragment; ainsi, implémenter une interface de recherche complètement indépendante d'une Activity n'est pas possible, car cela nécessiterait des modifications du système sous-jacent lui-même. Consultez le code source de la classe SearchableInfo si vous ne me croyez pas :).

Cela étant dit, il ne semble pas qu'il serait trop difficile de réaliser quelque chose de similaire à ce que vous décrivez. Par exemple, vous pouvez envisager d'implémenter votre activité searchable-Activity pour qu'elle accepte l'intention Android.intent.action.SEARCH et (au lieu d'afficher immédiatement les résultats dans une variable ListView, par exemple) et transmette la requête de recherche à votre Fragments. Par exemple, considérons l'activité de recherche suivante:

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

Lorsqu'une demande de recherche est faite, le système lancera votre activité interrogeable, exécutera la requête et transmettra les résultats à une activité conteneur (basée sur votre implémentation de doMySearch). Le conteneur Activity transmettra ensuite ces résultats à la Fragment consultable contenue, dans laquelle les résultats seront affichés. L'implémentation nécessite un peu plus de travail que ce que vous espériez probablement, mais je suis sûr qu'il existe des moyens de la rendre plus modulaire, et il semble que ce soit le mieux que vous puissiez faire.

p.s. Si vous utilisez cette approche, vous devrez peut-être accorder une attention particulière aux activités qui sont ajoutées/supprimées au backstack. Voir ce post pour plus d’informations sur la façon dont cela pourrait être fait.

p.p.s. Vous pouvez également oublier complètement l'interface de recherche standard et simplement mettre en œuvre une recherche simple dans Fragment, comme décrit dans l'article de Raghav ci-dessous .

87
Alex Lockwood

Voici l'exemple pour rechercher quelque chose à l'aide de fragments. J'espère que cela vous aidera et voici ce que vous recherchez:

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);
        }
    }
}
76
Rookie

Il est tout à fait possible de rechercher dans un fragment à l’aide de l’API ActionBar SearchView ActionView standard. Cela fonctionnera aussi avec Android 2.1 (API niveau 7) en utilisant les classes de support AppCompat v7. 

Dans votre 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;
        }
    });
}

Dans votre 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" />
53
David

Utilisation des classes de support AppCompat v7. En ajoutant quelque chose à la solution de @David à partir de la solution de @Rookie pour le faire fonctionner correctement, voici le code de mon fragment:

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

J'ai ajouté le onActivityCreated, cuz sans appeler setHasOptionsMenu(true);, le système ne saura pas que ce fragment doit interagir avec le menu.

puis j'ai supprimé la ligne inflater.inflate(R.menu.main, menu); car elle a doublé les éléments du menu puisque Activity a gonflé un menu, puis Fragment a gonflé un autre menu

Merci à @ David et @Rookie 

14
MBH

Lorsque vous travaillez avec Fragments, vous devez toujours utiliser une Activity pour contrôler et affecter la Fragments. Cette Activity peut avoir la même fonctionnalité de recherche.

Je suis récemment passé d'une application "normale" basée sur Activity à une application basée sur Fragment et la fonctionnalité de recherche a fonctionné de la même manière pour moi.

Avez-vous essayé de travailler dessus et n'avez pas réussi? Si c'est le cas, donnez plus de détails dans votre question.

MODIFIER:

Si vous souhaitez effectuer une recherche spécifique à un fragment, faites en sorte que votre Fragments étende une interface MyFragment avec une méthode startSearch et que votre méthode Activity's startSearch appelle la méthode startSearch du fragment en cours.

7
marmor

Je pense y être parvenu: vous pouvez réellement utiliser des fragments et ajouter une icône de recherche à une barre d’actions pour permettre une recherche à l’intérieur des fragments. L'astuce consiste à utiliser une barre d'action, une vue d'action, un écouteur, un chargeur et un adaptateur bien sûr. 

Cela fonctionne plutôt bien, même s'il contourne complètement le mécanisme de recherche de la plateforme Android (mais il pourrait être complété par quelques travaux pour trouver ce que décrit @Alex Lockwood et transmettre la recherche à des fragments). Cela ne réagirait pas à l'intention voulue dans le cas d'une activité, mais cela fonctionne: les utilisateurs peuvent rechercher dans des fragments. 

Voici le 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

La classe de fragment SearchFragment (j'utilise 2 instances dans l'activité ci-dessus).

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

Le fichier xml du menu des fragments de recherche 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>

Et le fichier de présentation XML 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>
5
Snicolas

Utilisez les variables ActionBar et SearchView. Vous pourrez gérer les recherches sans aucune connexion à Activity. Il suffit de définir une OnQueryTextListener dans 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;
    }
});

Voir this post pour plus de détails sur la recherche personnalisée.

5

j'ai trouvé un moyen de contourner le problème:) Vous pouvez remplacer cette méthode (startActivity (Intent)) dans votre baseActivity, puis vérifier si l'action est ACTION_SEARCH, puis effectuez votre travail spécial: D

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

        }
    }
1
S. Alawadi

Une Fragment ne peut exister en dehors d'une Activity et une Fragment ne peut pas être liée à un Android.intent.action.SEARCH ni à aucun autre intent-filter.

Donc, sans utiliser une Activity pour envelopper la Fragment, ce que vous demandez n'est pas possible.

1
Louth

autres solution ..... je n'aime pas ça . C'est plus facile pour moi.Mais c'est mon idée.Im en attente de votre avis

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

Activité

 @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
Numan Turkeri

Dans le cas de fragments dans un ViewPager, je pourrais le faire en bloquant le bouton de recherche lorsque je ne suis pas sur le fragment où je veux donner une barre de recherche. Dans l'activité: 

@Override
public boolean onSearchRequested() {

    if (mPager.getCurrentItem() == mAdapter.getPosition(FragmentType.VIDEO))
        return super.onSearchRequested();
    else
        return false;
}

Et en cas d’absence de bouton de recherche physique, j’ai ajouté un élément d’action dans le fragment, qui déclenche ce code:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (item.getItemId() == R.id.search_item) {

        return getSherlockActivity().onSearchRequested();
    }
    return super.onOptionsItemSelected(item);
}
1
galex

oui c'est possible, 

veuillez implémenter la vue de recherche sur votre activité, 'onQueryTextChange' dans Activity écoutera également la recherche dans fragment, vous pouvez vérifier la visibilité de fragment dans 'onQueryTextChange', si elle est visible, vous pouvez appeler votre méthode de recherche de fragment, son fonctionnement est parfait dans mon code

0
Libin Thomas