web-dev-qa-db-ja.com

フラグメントにSearchViewを追加する

アクションバーにサーチビューを含めようとしています。このために、私は次のことを行いました。

以下に示すように、メニューフォルダーに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));

    }

そして、フラグメントのoncreateでHasOptionsMenu = true;を設定しました。

上記のコードでは、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になる理由についてはわかりません。

どんな助けも大歓迎です。

12
user264953

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

                                          }
                                      }
        );
    }
29
Pavan Bilagi

2018年に更新された回答。Javaを使用している場合は、Kotlinでごめんなさい。

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)
_
5
Aqluse

2018年後半およびAPI> = 26互換(非推奨の警告)および適切にフォーマットされた回答の場合:

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>

ActivityFragment内のJavaコード:

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

    });
}

または2番目のオプションとして、ActivityFragmentSearchView.OnQueryTextListenerを実装させ、メニュー検索を使用します。

@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

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

onCreateOptionMenフラグメント内のメソッドsetHasOptionsMenu(true); inside 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;
            }
        });

    }
_
1
Queendevelopers

私はこの問題を解決しましたsearchView NullPointerExceptionの答えを共有したいです

メインアクティビティから以下のメソッドを削除する必要があります

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

onActivityCreated setHasOptionsMenu(true)およびOverrideメソッドで内部フラグメントを使用

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

また、マニフェストファイルにアクティビティのインテントフィルターを追加しないでください。

0
Edgar Khimich