Разверните и дайте фокус SearchView автоматически
Я разрабатываю приложение, в котором пользователь нажимает значок "поиск" в ActionBar
и SearchView
отображается в верхней части экрана.
моя проблема в том, что SearchView
не находится в фокусе и не расширяется, поэтому пользователь должен нажать кнопку поиска на Searchview
чтобы сделать его расширить и вывести на клавиатуру.
как это должно решаться?
14 ответов:
чтобы сделать 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
и есть.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();
Это сработало для меня:
в корневом макете:
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
эти две ситуации работают для меня.
можно использовать
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)
использовать
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);
SearchView MenuItemCompat имеет свойство с именем maxWidth.
final MenuItem searchItem = menu.findItem(R.id.action_search); final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setMaxWidth(xxx);
используйте ширину экрана вместо xxx offcourse
Я использую android.виджет 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"/>
ответ @ 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; } });