Развернуть и настроить фокус на 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);