Развернуть и настроить фокус на SearchView автоматически
Я разрабатываю приложение, в котором пользователь нажимает значок "Поиск" в ActionBar
, а SearchView
становится видимым в верхней части экрана.
Моя проблема заключается в том, что SearchView
не фокусируется и не расширяется, поэтому пользователю нужно нажать кнопку поиска на SearchView
, чтобы он расширялся и выводил клавиатуру.
Как это можно решить?
Ответы
Ответ 1
Чтобы сделать SearchView расширенным по умолчанию, вызовите setIconifiedByDefault(false)
на нем, когда вы его инициализируете (например, в onCreateOptionsMenu(..)
или onPrepareOptionsMenu(..)
). Я обнаружил, что в большинстве случаев это автоматически сфокусирует внимание, но если не просто вызвать requestFocus()
на нем.
Ответ 2
Вы также можете вызвать метод 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"
/>
Ответ 3
Если вы хотите иметь его 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();
Ответ 4
Если вы используете его в макете, вы можете позвонить
mSearchView.onActionViewExpanded()
Ответ 5
Это сработало для меня:
menu.expandActionView();
Ответ 6
Это сработало для меня:
В корневом макете:
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"
Ответ 7
Если вы используете внутри действия, вам нужно использовать
view.onActionViewExpanded();
если вы используете параметры внутреннего меню, вам нужно использовать
MenuItem.expandActionView();
Примечание: он работает только для SearchView
эти две ситуации работают для меня.
Ответ 8
Вы можете использовать метод SearchView#setIconified()
для дескриптора SearchView в вашем Java-коде. Подробнее здесь:
http://developer.android.com/reference/android/widget/SearchView.html#setIconified(boolean)
Вы также можете использовать SearchView#setIconifiedByDefault()
. Подробнее здесь:
http://developer.android.com/reference/android/widget/SearchView.html#setIconifiedByDefault(boolean)
Ответ 9
используйте этот
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);
Ответ 10
MenuItemCompat SearchView имеет свойство с именем maxWidth.
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);
используйте ширину экрана вместо xxx offcourse
Ответ 11
android:iconifiedByDefault="true"
в вашем XML файле
Ответ 12
Я использую 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"/>
Ответ 13
Ответ на pascalius работал у меня. Но каждый раз, когда вы закрываете SearchView и снова нажимаете, вы теряете Focus. Поэтому я вставил код в 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;
}
});
Ответ 14
Для Appcompat Searchview вы можете использовать этот метод:
MenuItemCompat.expandActionView(mSearchMenuItem);