web-dev-qa-db-ger.com

SearchView in Fragment hinzufügen

Versuch, eine Suchansicht in die Aktionsleiste aufzunehmen. Dafür habe ich Folgendes getan:

Erstellt MenuSearch.xml im Menüordner wie folgt:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
   <item
    Android:id="@+id/action_search"
    Android:actionViewClass="Android.Support.V7.Widget.SearchView"
    Android:icon="@Android:drawable/ic_menu_search"
    Android:showAsAction="always"
    Android:title="Search"/>

</menu>

Enthält die Methode OnCreateOptionsMenu im Fragment:

public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater)
    {
        inflater.Inflate(Resource.Menu.MenuSearch, menu);
        base.OnCreateOptionsMenu(menu, inflater);
        var searchManager = (SearchManager) this.Activity.GetSystemService(Context.SearchService);
        searchView = (SearchView) (menu.FindItem(Resource.Id.action_search).ActionView);
        searchView.SetSearchableInfo(searchManager.GetSearchableInfo(Activity.ComponentName));

    }

Und ich habe HasOptionsMenu = true; in oncreate des Fragments gesetzt.

Mit dem Code oben bekomme ich einen Nullzeiger in der Zeile searchView.SetSearchableInfo.... Nicht sicher, warum dies passiert, obwohl alles richtig und an Ort und Stelle zu sein scheint.

Basierend auf einigen Vorschlägen zum Lösen ähnlicher Probleme habe ich auch die folgende Option für den Suchbereich ausprobiert.

        var item = menu.FindItem (Resource.Id.action_search);
        var searchItem = MenuItemCompat.GetActionView(item);
        searchView = searchItem.JavaCast<Android.Support.V7.Widget.SearchView>();
        searchView.SetSearchableInfo(searchManager.GetSearchableInfo(Activity.ComponentName));

Aber wieder bekomme ich searchView als null.

Nun, da ich die möglichen Optionen ausprobiert habe, weiß ich nicht, warum searchview null wird. 

Jede Hilfe wird sehr geschätzt.

11
user264953

Ändern Sie Ihre MenuSearch.xml in 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/action_search"
        Android:title="@string/app_name"
        Android:icon="@drawable/ic_action_search"
        app:showAsAction="collapseActionView|ifRoom"
         />
</menu>

Und in Ihrem Fragment searchView.setOnQueryTextListener hinzufügen

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        inflater.inflate(R.menu.search_option_menu, menu);
        MenuItem item = menu.findItem(R.id.action_search);
        SearchView searchView = new SearchView(((MainActivity) mContext).getSupportActionBar().getThemedContext());
        MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
        MenuItemCompat.setActionView(item, searchView);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
        searchView.setOnClickListener(new View.OnClickListener() {
                                          @Override
                                          public void onClick(View v) {

                                          }
                                      }
        );
    }
28
Pavan Bilagi

Antwort aktualisiert für 2018. Sorry für Kotlin, wenn Sie Java verwenden.

Ihre XML-Menüressource (zum Beispiel search_menu.xml):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/action_search"
        Android:title="@string/app_name"
        Android:icon="@drawable/ic_search"
        app:showAsAction="collapseActionView|ifRoom"
        />
</menu>

Aufbaucode:

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater?) {
    super.onCreateOptionsMenu(menu, inflater)
    menu.clear()
    inflater?.inflate(R.menu.search_menu, menu)
    val searchView = SearchView((context as MainActivity).supportActionBar?.themedContext ?: context)
    menu.findItem(R.id.action_search).apply {
        setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW or MenuItem.SHOW_AS_ACTION_IF_ROOM)
        actionView = searchView
    }

    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
            return false
        }

        override fun onQueryTextChange(newText: String): Boolean {
            return false
        }
    })
    searchView.setOnClickListener {view ->  }
}

Sie müssen wahrscheinlich auch diese Zeile in onCreate() setzen (funktioniert für mein Fragment), damit dies alles angezeigt wird:

setHasOptionsMenu(true)
4
Aqluse

Für Ende 2018 und für apis> = 26 Kompatibel (Verfallswarnungen) und eine richtig formatierte Antwort:

Das menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/action_search"
        Android:title="Search_change_me_with_proper_id"
        Android:icon="@drawable/ic_action_search"
        app:showAsAction="collapseActionView|ifRoom"/>
</menu>

Java-Code innerhalb des ActivityFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    setHasOptionsMenu(true); // Add this!
    return inflater.inflate(R.layout.fragment_add_app, container, false);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();

    inflater.inflate(R.menu.menu_add_app, menu);
    MenuItem item = menu.findItem(R.id.action_search_menu_add_app);
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM);

    SearchView searchView = (SearchView) item.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            // Here is where we are going to implement the filter logic
            return true;
        }

    });
}

ODER als zweite Option Sie lassen die ActivityFragment implementieren SearchView.OnQueryTextListener und dann die Menüsuche verwenden:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    setHasOptionsMenu(true); // Add this! (as above)
    return inflater.inflate(R.layout.fragment_add_app, container, false);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.menu_add_app, menu);
    MenuItem item = menu.findItem(R.id.action_search_menu_add_app);
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM);

    SearchView searchView = (SearchView) item.getActionView();
    searchView.setOnQueryTextListener(this); // Fragment implements SearchView.OnQueryTextListener
}

@Override
public boolean onQueryTextChange(String query) {
    // Here is where we are going to implement the filter logic
    return false;
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}
2
Tanasis

ich habe dieses Problem gelöst. Ich möchte meine Antwort für searchView NullPointerException freigeben

wir müssen die unten stehende Methode von der Hauptaktivität entfernen

      public boolean onOptionsItemSelected(MenuItem item) {
          int id = item.getItemId();  
          return true;

und inner-fragment in OnActivityCreated setHasOptionsMenu(true) und Override-Methoden verwenden

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         inflater.inflate(R.menu.menu, menu);
    }

    @Override
     public boolean onOptionsItemSelected(MenuItem item) {
       // handle item selection
        switch (item.getItemId()) {
            case R.id.action_search:

     //       onCall();   //your logic

            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
1
Dinesh

Ihre search_options_menu.xml sollte so aussehen:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/action_search"
        Android:title="@string/app_name"
        Android:icon="@drawable/ic_action_search"
        app:showAsAction="collapseActionView|ifRoom"
         />
</menu>

Überschreiben Sie onCreateOptionMenu in Ihrem Fragment setHasOptionsMenu(true); in onCreate () in Ihrem Fragment.

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
       menu.clear();
        inflater.inflate(R.menu.search_option_menu, menu);
        MenuItem item = menu.findItem(R.id.action_search);
                SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
        MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
        MenuItemCompat.setActionView(item, searchView);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                    //Do search code here
                return true;
            }
        });

    }
0
Queendevelopers
search_view.setOnQueryTextListener(object: SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                return false
            }

            override fun onQueryTextChange(query: String?): Boolean {
                adapter.filter.filter(query)
                return true
            }
        })

Fügen Sie den Absichtsfilter für Ihre Aktivität nicht in die Manifest-Datei ein.

0
Edgar Khimich