wake-up-neo.com

Android-Suche mit Fragmenten

Kennt jemand ein Tutorial oder ein Beispiel für die Implementierung der Standard Android-Suchoberfläche mit Fragments? Ist es mit anderen Worten möglich, eine Standardsuche mit einer SearchManager in ein Fragment einzufügen?

154
Blackbelt

Kurz gesagt, das kannst du nicht. Es gibt mehrere Gründe, warum das Erstellen einer Suchoberfläche in einem Fragmentnicht möglich ist.

  1. Beim Erstellen einer durchsuchbaren Oberfläche müssen Sie in Ihrem Android Manifest eine standardmäßige "durchsuchbare Aktivität" angeben. Wie Sie sicher wissen, kann ein Fragmentnicht ohne einen übergeordneten Activityexistieren, und daher ist diese Trennung nicht möglich.

  2. Wenn Sie bereits die Nummer 1 herausgefunden haben, gehen wir davon aus, dass Sie diese Frage in der Hoffnung gestellt haben, dass es da draußen einen magischen "Hack" gibt, der die Arbeit erledigen kann. Die Dokumentation besagt jedoch, dass

    Wenn der Benutzer eine Suche im Suchdialog oder Widget ausführt, startet das System Ihre durchsuchbare Aktivität und liefert die Suchabfrage in einem Intent mit der Aktion ACTION_SEARCH. Ihre durchsuchbare Aktivität ruft die Abfrage aus dem Zusatz QUERY der Absicht ab, durchsucht dann Ihre Daten und zeigt die Ergebnisse an.

    Das zugrunde liegende interne System, das für die Bereitstellung der Suchergebnisse verantwortlich ist, erwartet einen Activityund keinen Fragmentname__. Daher ist es nicht möglich, eine Suchschnittstelle zu implementieren, die völlig unabhängig von Activityist, da dies Änderungen am zugrunde liegenden System selbst erforderlich machen würde . Schauen Sie sich den Quellcode für die Klasse SearchableInfoNAME _ an, wenn Sie mir nicht glauben :).

Abgesehen davon scheint es nicht allzu schwierig zu sein, etwas Ähnliches wie das zu erreichen, was Sie beschreiben. Sie könnten beispielsweise in Betracht ziehen, Ihre durchsuchbare Aktivität so zu implementieren, dass sie die Absicht Android.intent.action.SEARCH akzeptiert und (anstatt die Ergebnisse sofort in einem ListViewanzuzeigen) die Suchabfrage an Ihren Fragmentname__s weiterleitet. Betrachten Sie beispielsweise die folgende durchsuchbare Aktivität:

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

Wenn eine Suchanfrage gestellt wird, startet das System Ihre durchsuchbare Aktivität, führt die Abfrage durch und übergibt die Ergebnisse an eine Containeraktivität (basierend auf Ihrer Implementierung von doMySearchname__). Der Container Activity übergibt diese Ergebnisse dann an das enthaltene durchsuchbare Fragmentname__, in dem die Ergebnisse angezeigt werden. Die Implementierung erfordert etwas mehr Arbeit als Sie sich wahrscheinlich erhofft hatten, aber ich bin sicher, dass es Möglichkeiten gibt, sie modularer zu gestalten, und es scheint, als wäre dies das Beste, was Sie tun können.

p.s. Wenn Sie diesen Ansatz verwenden, müssen Sie möglicherweise besonders darauf achten, welche Aktivitäten dem Backstack hinzugefügt/daraus entfernt werden. Siehe this post ​​für weitere Informationen darüber, wie dies gemacht werden könnte.

p.p.s. Sie können auch die Standard-Suchoberfläche komplett vergessen und einfach eine einfache Suche in einem Fragmentimplementieren, wie in Raghavs Post unten beschrieben .

87
Alex Lockwood

Hier ist das Beispiel, um etwas mit Fragmenten zu suchen. Hoffe es hilft und das ist, was Sie suchen:

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

Es ist durchaus möglich, ein Fragment mit der ActionView-ActionView-API von ActionBar zu suchen. Dies funktioniert auch auf Android 2.1 (API-Ebene 7) mit den AppCompat-Supportklassen v7. 

In deinem 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 Ihrem 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" />
53
David

AppCompat-Unterstützungsklassen v7 verwenden. Hinzufügen von etwas zu @David 's Lösung von @Rookie lösung, damit es auf einfache Weise richtig funktioniert, hier ist mein 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;
    }
}

Ich habe onActivityCreated, cuz hinzugefügt, ohne setHasOptionsMenu(true); aufzurufen. Das System weiß nicht, dass dieses Fragment mit dem Menü interagieren muss.

dann entfernte ich die Zeile inflater.inflate(R.menu.main, menu);, weil dadurch die Menüpunkte verdoppelt wurden, da Activity ein Menü aufgeblasen hatte, und Fragment ein anderes Menü

Danke an @David und @Rookie 

14
MBH

Wenn Sie mit Fragments arbeiten, müssen Sie weiterhin Activity verwenden, um Fragments..__ zu steuern und zuzuweisen. Diese Activity kann wie zuvor über die Suchfunktion verfügen.

Ich habe kürzlich von einer "normalen" Activity-basierten App zu einer Fragment-basierten App gewechselt, und die Suchfunktion funktionierte für mich genauso.

Haben Sie versucht, daran zu arbeiten, und es ist Ihnen nicht gelungen? Wenn ja, geben Sie in Ihrer Frage etwas genaueres an.

BEARBEITEN:

Wenn Sie eine fragmentspezifische Suche durchführen möchten, erweitern Sie alle Ihre Fragments-Schnittstelle um eine MyFragment-Schnittstelle mit einer startSearch-Methode, und rufen Sie die Activity-Methode der startSearch-Methode der startSearch-Methode auf.

7
marmor

Ich glaube, ich habe es geschafft: Sie können tatsächlich Fragmente verwenden und einer Aktionsleiste ein Suchsymbol hinzufügen, sodass eine Suche innerhalb der Fragmente möglich ist. Der Trick besteht darin, eine Aktionsleiste, eine Aktionsansicht, einen Listener, einen Loader und natürlich einen Adapter zu verwenden. 

Dies funktioniert ziemlich gut, obwohl es den Android-Plattform-Suchmechanismus vollständig umgeht (es könnte jedoch mit einigen Arbeiten abgeschlossen werden, um herauszufinden, was @Alex Lockwood beschreibt und die Suche an Fragmente weitergibt). Es würde nicht wie erwartet auf eine Absicht im Falle einer Aktivität reagieren, aber es funktioniert: Benutzer können innerhalb von Fragmenten suchen. 

Hier ist der 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

Die Fragmentklasse SearchFragment (Ich verwende zwei Instanzen in der obigen Aktivität).

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

Die XML-Datei für das Menü der Suchfragmente 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>

Und die XML-Layoutdatei 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

Verwenden Sie die ActionBar und SearchView. Sie können Suchvorgänge ohne Verbindung zu Activity durchführen. Setzen Sie einfach eine OnQueryTextListener auf die 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;
    }
});

Unter this post finden Sie weitere Details zur benutzerdefinierten Suche.

5

ich habe eine Arbeit gefunden:) Sie können diese Methode (StartActivity (Intent)) in Ihrer BaseActivity überschreiben und dann überprüfen, ob die Aktion ACTION_SEARCH ist

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

        }
    }
1
S. Alawadi

Ein Fragment kann nicht außerhalb eines Activity existieren, und ein Fragment kann nicht mit einem Android.intent.action.SEARCH oder einem anderen intent-filter verknüpft sein.

Ohne Activity zum Umwickeln von Fragment ist das, was Sie fragen, nicht möglich.

1
Louth

andere Lösung ..... Ich mag das nicht ... __Das ist für mich leichter

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

Aktivität

 @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

Bei Fragmenten in einem ViewPager kann ich dies tun, indem ich die Suchschaltfläche blockiere, wenn ich mich nicht an dem Fragment befinde, an dem ich eine Suchleiste angeben möchte. In die Aktivität: 

@Override
public boolean onSearchRequested() {

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

Falls keine Schaltfläche für die physische Suche vorhanden ist, habe ich dem Fragment ein Aktionselement hinzugefügt, das diesen Code auslöst:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

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

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

ja es ist möglich, 

bitte implementieren Sie die Suchansicht in Ihrer Aktivität, 'onQueryTextChange' in Activity hört auch die Suche in Fragmenten an. Sie können die Sichtbarkeit der Fragmente in 'onQueryTextChange' überprüfen. Wenn sie sichtbar ist, können Sie Ihre Suchmethode für fragment aufrufen

0
Libin Thomas