Добавление SearchView в Фрагмент

попытка включить searchview в actionbar. Для этого я сделал следующее:

Создано MenuSearch.XML в папке меню, как показано ниже:

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

включен метод OnCreateOptionsMenu в фрагмент:

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

    }

и я поставил HasOptionsMenu = true; в oncreate фрагмента.

С кодом выше, я получаю нулевой указатель в строке searchView.SetSearchableInfo... . Не уверен, почему это происходит, хотя все кажется правильным и в место.

основываясь на некоторых предложениях по решению подобной проблемы, я также опробовал приведенную ниже опцию для searchview.

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

но опять же, я получаю searchView как null.

теперь, когда я попробовал возможные варианты, я не знаю, почему searchview становится null.

любая помощь очень ценится.

5 ответов


измените свой MenuSearch.в 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_action_search"
        app:showAsAction="collapseActionView|ifRoom"
         />
</menu>

и в вашем фрагменте добавить searchView.setOnQueryTextListener

@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) {

                                          }
                                      }
        );
    }

я решил эту проблему, я хочу поделиться своим ответом для searchView NullPointerException

нам нужно удалить ниже метод из основной деятельности

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

и использовать внутренний фрагмент в OnActivityCreated setHasOptionsMenu(true) и переопределить методы

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

код search_options_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_action_search"
        app:showAsAction="collapseActionView|ifRoom"
         />
</menu>

переопределить onCreateOptionMenu метод В фрагмент setHasOptionsMenu(true); внутри onCreate () на ваш фрагмент.

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

    }

ответ обновлен для 2018 года. Извините за Kotlin, если вы используете Java.

ваш ресурс меню xml (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>

наращивание код:

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

вам, вероятно, также нужно будет поместить эту строку в onCreate() (работал для моего фрагмента), чтобы все это появилось:

setHasOptionsMenu(true)

в моем фрагменте onCreateOptionsMenu код

SearchManager searchManager =
        (SearchManager)getActivity().getSystemService(Context.SEARCH_SERVICE);
SearchableInfo searchableInfo =
        searchManager.getSearchableInfo(getActivity().getComponentName());
searchItem = menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setSearchableInfo( searchableInfo);

произведено следующее сообщение об ошибке : Ява.ленг.NullPointerException: попытка вызвать виртуальный метод " void android.поддержка.В7.штучка.SearchView.setSearchableInfo (android.приложение.SearchableInfo) ' по нулевой ссылке на объект

после того, как я изменил в меню.xml android: actionViewClass to app:actionViewClass проблема не возникла снова. меню.XML-код :

<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  tools:context="...">
<item
android:id="@+id/menu_search"
android:title="@string/menu_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom">