web-dev-qa-db-ja.com

Toolbar AndroidでSearchViewを使用する方法

私が取り組んでいるコードはToolbarを使っていてmenuを膨らませています。

これがコードです

private Toolbar mToolbar;
mToolbar.inflateMenu(R.menu.chat_screen_menu);
setupMenu ();
private void setupMenu ()
   {
   mMenu = mToolbar.getMenu();
   if (mMenu != null)
      {
       if (mChatPager != null && mChatPager.getCurrentItem() > 0)
          {
          mMenu.setGroupVisible(R.id.menu_group_chats, true);
          mMenu.setGroupVisible(R.id.menu_group_contacts, false);
          }
       else
          {
           mMenu.setGroupVisible(R.id.menu_group_chats, false);
           mMenu.setGroupVisible(R.id.menu_group_contacts, true);
           mMenu.setGroupVisible(R.id.menu_group_otr_verified,false);
           mMenu.setGroupVisible(R.id.menu_group_otr_unverified,false);
           mMenu.setGroupVisible(R.id.menu_group_otr_off,false);
          }
    }
    mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener ()
    {
    ..........
    }
}

しかし今、彼らはtool_barSearchボタンを必要とします。私はそれを置くことができた、私はここにガイド に従った 私が検索のために何かを書き込もうとしたとき、私はlistenerをテストするために置いたトーストは示されなかった。これはlistenerが機能していないことを示します

@Override
    public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.chat_screen_menu, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_menu_search));
    final Toast toast = new Toast(mApp);

    if (mSearchView != null )
    {
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
        {
            public boolean onQueryTextChange(String newText)
            {
                mSearchString = newText;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test1", Toast.LENGTH_LONG).show();
                return true;
            }

            public boolean onQueryTextSubmit(String query)
            {
                mSearchString = query;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test2", Toast.LENGTH_LONG).show();

                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);
    }

    return true;

}
113
Shudy

そのためにはAppcompatライブラリを使う必要があります。以下のように使われます:

dashboard.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" 
      xmlns:tools="http://schemas.Android.com/tools"
      xmlns:app="http://schemas.Android.com/apk/res-auto">

    <item
        Android:id="@+id/action_search"
        Android:icon="@Android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="Android.support.v7.widget.SearchView"
        Android:title="Search"/>
</menu>

活動ファイル:

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.dashboard, menu);

     MenuItem searchItem = menu.findItem(R.id.action_search);

    SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);

    SearchView searchView = null;
    if (searchItem != null) {
        searchView = (SearchView) searchItem.getActionView();
    }
    if (searchView != null) {
        searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
    }
        return super.onCreateOptionsMenu(menu);
}

マニフェストファイル:

<meta-data 
      Android:name="Android.app.default_searchable" 
      Android:value="com.apkgetter.SearchResultsActivity" /> 

        <activity
            Android:name="com.apkgetter.SearchResultsActivity"
            Android:label="@string/app_name"
            Android:launchMode="singleTop" >
            <intent-filter>
                <action Android:name="Android.intent.action.SEARCH" />
            </intent-filter>
            <intent-filter>
                <action Android:name="Android.intent.action.VIEW" />
            </intent-filter>

            <meta-data
                Android:name="Android.app.searchable"
                Android:resource="@xml/searchable" />
        </activity>

検索可能なxmlファイル:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:hint="@string/search_hint"
    Android:label="@string/app_name" />

そして最後に、あなたのSearchResultsActivityクラスのコードです。検索結果を表示します。

190
Sagar Maiyad

Fragment内に検索機能を設定したい場合は、以下の数行を追加してください。

ステップ1 - あなたに検索フィールドを追加toolbar

<item
    Android:id="@+id/action_search"
    Android:icon="@Android:drawable/ic_menu_search"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="Android.support.v7.widget.SearchView"
    Android:title="Search"/>

ステップ2 - onCreateOptionsMenu()にロジックを追加

import Android.support.v7.widget.SearchView; // not the default !

@Override
public boolean onCreateOptionsMenu( Menu menu) {
    getMenuInflater().inflate( R.menu.main, menu);

    MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
    searchView = (SearchView) myActionMenuItem.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // Toast like print
            UserFeedback.show( "SearchOnQueryTextSubmit: " + query);
            if( ! searchView.isIconified()) {
                searchView.setIconified(true);
            }
            myActionMenuItem.collapseActionView();
            return false;
        }
        @Override
        public boolean onQueryTextChange(String s) {
            // UserFeedback.show( "SearchOnQueryTextChanged: " + s);
            return false;
        }
    });
    return true;
}
154
tjm1706

ツールバーに直接追加したい場合。

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.AppBarLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/app_bar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <SearchView
            Android:id="@+id/searchView"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:iconifiedByDefault="false"
            Android:queryHint="Search"
            Android:layout_centerHorizontal="true" />

    </Android.support.v7.widget.Toolbar>

</Android.support.design.widget.AppBarLayout>
27
Ali

SearchViewとRecyclerViewの統合

1)メニューにSearchViewの項目を追加する

SearchViewname__はmenuを使ってactionViewname__として追加できます。

app:useActionClass = "Android.support.v7.widget.SearchView".

<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="rohksin.com.searchviewdemo.MainActivity">
<item
    Android:id="@+id/searchBar"
    app:showAsAction="always"
    app:actionViewClass="Android.support.v7.widget.SearchView"
    />
</menu>

2)アクティビティにSearchView.OnQueryTextListenerを実装します。

SearchView.OnQueryTextListenerには2つの抽象メソッドがあります。そのため、SearchViewテキストリスナーを実装した後のアクティビティスケルトンは、このようになります。

YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{

   public boolean onQueryTextSubmit(String query)

   public boolean onQueryTextChange(String newText) 

}

3)SerchViewヒントテキスト、リスナーなどを設定する

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);

    MenuItem searchItem = menu.findItem(R.id.searchBar);

    SearchView searchView = (SearchView) searchItem.getActionView();
    searchView.setQueryHint("Search People");
    searchView.setOnQueryTextListener(this);
    searchView.setIconified(false);

    return true;
}

4)SearchView.OnQueryTextListenerを実装します。

これが、リスナーの抽象メソッドを実装する方法です。

@Override
public boolean onQueryTextSubmit(String query) {

    // This method can be used when a query is submitted eg. creating search history using SQLite DB

    Toast.makeText(this, "Query Inserted", Toast.LENGTH_SHORT).show();
    return true;
}

@Override
public boolean onQueryTextChange(String newText) {

    adapter.filter(newText);
    return true;
}

5)RecyclerViewアダプタにフィルタメソッドを書きます。

あなたはあなたの要求に基づいてあなた自身の論理を思いつくことができます。これはSearchViewname__に入力されたテキストを含むNameのリストを表示するためのサンプルコードスニペットです。

public void filter(String queryText)
{
    list.clear();

    if(queryText.isEmpty())
    {
        list.addAll(copyList);
    }
    else
    {

        for(String name: copyList)
        {
            if(name.toLowerCase().contains(queryText.toLowerCase()))
            {
                list.add(name);
            }
        }

    }

    notifyDataSetChanged();
}

完全に機能するコードのサンプルを見つけることができます> HERE
SearchViewのSQLiteデータベースでこのコードをチェックアウトすることもできます Music App

11
Rohit Singh

menu.xmlファイルを使用せずにSearchViewを実装し、ボタンから開く

あなたのActivityでは、onCreateOptionsMenuメソッドを使う必要があります。このメソッドでは、Serchviewをプログラム的に拡張します。

private MenuItem searchMenu;
private String mSearchString="";

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        SearchManager searchManager = (SearchManager) StoreActivity.this.getSystemService(Context.SEARCH_SERVICE);


        SearchView mSearchView = new SearchView(getSupportActionBar().getThemedContext());
        mSearchView.setQueryHint(getString(R.string.Prompt_search)); /// YOUR HINT MESSAGE
        mSearchView.setMaxWidth(Integer.MAX_VALUE);

        searchMenu = menu.add("searchMenu").setVisible(false).setActionView(mSearchView);
        searchMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);


        assert searchManager != null;
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
            public boolean onQueryTextChange(String newText) {
                mSearchString = newText;

                return true;
            }

            public boolean onQueryTextSubmit(String query) {
                mSearchString = query;

                searchMenu.collapseActionView();


                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);


        return true;
    }

アクティビティクラスでは、ツールバーのボタンをクリックすると以下のようにSearchViewを開くことができます。

YOUR_BUTTON.setOnClickListener(view -> {

            searchMenu.expandActionView();

        });
0