ユーザーがActionBar
の[検索]アイコンを押すと、画面の上部にSearchView
が表示されるアプリケーションを開発しています。
私の問題は、SearchView
がフォーカスも展開もされていないため、ユーザーがSearchview
の検索ボタンを押して展開し、キーボードを表示する必要があることです。
これはどのように解決する必要がありますか?
SearchViewをデフォルトで展開するには、初期化するときにsetIconifiedByDefault(false)
を呼び出します(例:onCreateOptionsMenu(..)
またはonPrepareOptionsMenu(..)
)。ほとんどの場合、これにより自動的にフォーカスが得られることがわかりましたが、そうでない場合は単にrequestFocus()
を呼び出します。
ExpandActionView()メソッドを呼び出して強制することもできます。
@Override
public boolean onCreateOptionsMenu( Menu menu )
{
super.onCreateOptionsMenu( menu );
MenuItem searchMenuItem = menu.findItem( R.id.mi_search ); // get my MenuItem with placeholder submenu
searchMenuItem.expandActionView(); // Expand the search menu item in order to show by default the query
return true;
}
アクションバーレイアウトでアイテムを検索:
<item
Android:id="@+id/mi_search"
Android:icon="@drawable/abs__ic_search_api_holo_light"
Android:title="@string/search"
Android:showAsAction="ifRoom|collapseActionView"
Android:actionViewClass="com.actionbarsherlock.widget.SearchView"
/>
あなたがそれをiconifiedByDefault
にしたい場合、これは私のために働いた。 setFocusable
とsetIconified
が必要です。
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconifiedByDefault(true);
searchView.setFocusable(true);
searchView.setIconified(false);
searchView.requestFocusFromTouch();
更新:Android.support.v7.widget.SearchView
を使用している場合、動作は非常に異なります。キーボードのポップアップを常に表示したくない場合は、clearFocus
が必要です。何らかの理由で、appcompatを使用すると、メニューが常に再作成されます。
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setIconified(false);
searchView.clearFocus();
レイアウトで使用している場合、呼び出すことができます
mSearchView.onActionViewExpanded()
これは私のために働いた:
ルートレイアウト:
xmlns:app="http://schemas.Android.com/apk/res-auto"
SearchViewは次のように定義されています。
<Android.support.v7.widget.SearchView
Android:id="@+id/search_contacts"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:layout_margin="15dp"
Android:background="@drawable/search_view"
app:iconifiedByDefault="false"
app:queryHint="Search name or email"
>
<requestFocus />
</Android.support.v7.widget.SearchView>
違いはアプリタグです。
app:iconifiedByDefault="false"
app:queryHint="Search name or email"
アクティビティ内で使用している場合は、使用する必要があります
view.onActionViewExpanded();
メニューオプション内で使用している場合は、使用する必要があります
MenuItem.expandActionView();
注:SearchViewでのみ機能します
これらの2つの状況は私のために働いています。
これは私のために働いた:
menu.expandActionView();
Javaコード内のSearchViewハンドルでSearchView#setIconified()
メソッドを使用できます。詳細:
http://developer.Android.com/reference/Android/widget/SearchView.html#setIconified(boolean)
SearchView#setIconifiedByDefault()
を使用することもできます。詳細はこちら:
http://developer.Android.com/reference/Android/widget/SearchView.html#setIconifiedByDefault(boolean)
これを使って
SearchManager searchManager = (SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = new SearchView(mActivity.actionBar.getThemedContext());
searchView.setSearchableInfo(searchManager.getSearchableInfo(mActivity.getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setQueryHint("Search");
menu.findItem(R.id.action_search).setActionView(searchView);
@Pascaliusの答えは私のために働いた。ただし、SearchViewを閉じてもう一度クリックするたびに、フォーカスが失われます。そこで、次のようにsetOnMenuItemClickListener
にコードを挿入しました。
MenuItem item = menu.findItem(R.id.action_search);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView = (SearchView) item.getActionView();
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
searchView.setIconifiedByDefault(true);
searchView.setFocusable(true);
searchView.setIconified(false);
searchView.requestFocusFromTouch();
return false;
}
});
Android:iconifiedByDefault="true"
xmlファイルで
私はAndroid.widget Searchviewを使用しており、デフォルトでアイコン化されています。xmlのコードの下で、クリックすると検索ビューで展開してオートフォーカスするのに役立ちました:
<SearchView
Android:id="@+id/searchView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:iconifiedByDefault="true"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:queryHint="Search"/>
MenuItemCompatのSearchViewには、maxWidthという名前のプロパティがあります。
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);
xxx offcourseの代わりに画面幅を使用する
Appcompat Searchviewの場合、このメソッドを使用できます。
MenuItemCompat.expandActionView(mSearchMenuItem);