私が取り組んでいるコードは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_bar
にSearch
ボタンを必要とします。私はそれを置くことができた、私はここにガイド に従った 私が検索のために何かを書き込もうとしたとき、私は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;
}
そのためには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
クラスのコードです。検索結果を表示します。
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;
}
ツールバーに直接追加したい場合。
<?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>
SearchView
name__はmenuを使ってactionView
name__として追加できます。
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>
SearchView.OnQueryTextListener
には2つの抽象メソッドがあります。そのため、SearchViewテキストリスナーを実装した後のアクティビティスケルトンは、このようになります。
YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{
public boolean onQueryTextSubmit(String query)
public boolean onQueryTextChange(String newText)
}
@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;
}
これが、リスナーの抽象メソッドを実装する方法です。
@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;
}
あなたはあなたの要求に基づいてあなた自身の論理を思いつくことができます。これはSearchView
name__に入力されたテキストを含む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
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();
});