ユーザーがで「検索」アイコンを押すと、画面の上部にActionBar
aが表示されるアプリケーションを開発しています。SearchView
私の問題は、SearchView
がフォーカスされておらず、拡張されていないため、ユーザーがの検索ボタンを押しSearchview
て拡張し、キーボードを引き出す必要があることです。
これはどのように解決する必要がありますか?
強制的に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"
/>
SearchViewをデフォルトで展開するには、初期化するときにsetIconifiedByDefault(false)onCreateOptionsMenu(..)
を呼び出します(たとえば、またはonPrepareOptionsMenu(..)
)。ほとんどの場合、これにより自動的にフォーカスが与えられますが、そうでない場合は、単にそれを呼び出すrequestFocus()
こともできます。
あなたがそれを持ちたいのなら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();
SearchView#setIconified()
このメソッドは、JavaコードのSearchViewハンドルで使用できます。詳細はこちら:
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;
}
});
Appcompat Searchviewの場合、次の方法を使用できます。
MenuItemCompat.expandActionView(mSearchMenuItem);
Kotlin
var searchView = menu.findItem(R.id.action_search).actionView as SearchView
searchView.isIconified = true
expandActionView()
menuItemを呼び出します。
menuItem.expandActionView()
でこれを行うのに苦労していましSearchView widget
たが、expandActionView() method
実際にはSearchViewクラスではなくMenuItemクラスで定義されています。だから、私はそれを解決しました
MenuItem searchItem = menu.findItem(R.id.item_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchItem.expandActionView();//the method expandActionView is called on searchItem not searchView
MenuItemCompatのSearchViewには、maxWidthという名前のプロパティがあります。
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);
xxxオフコースの代わりに画面幅を使用する
私はandroid.widgetSearchviewを使用しており、デフォルトでアイコン化されています。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"/>
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="Search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always"/>
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setQueryHint("Search the customer...");
searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconifiedByDefault(false);
searchView.requestFocus();
}
<pre>
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="Search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always"/>
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setQueryHint("Search the customer...");
searchView.setSearchableInfo(Objects.requireNonNull(searchManager).getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setIconifiedByDefault(false);
searchView.requestFocus();
}
</pre>
android:iconifiedByDefault="true"
上記のXMLのコードは、クリックしたときに展開して検索ビューにオートフォーカスするのに役立ちました。