Разверните и дайте фокус SearchView автоматически


Я разрабатываю приложение, в котором пользователь нажимает значок "поиск" в ActionBar и SearchView отображается в верхней части экрана.

моя проблема в том, что SearchView не находится в фокусе и не расширяется, поэтому пользователь должен нажать кнопку поиска на Searchview чтобы сделать его расширить и вывести на клавиатуру.

как это должно решаться?

14 52

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();

Если вы используете его в макете, вы можете вызвать

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"

это сработало для меня:

menu.expandActionView();

Если вы используете внутри деятельности вам нужно использовать

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:iconifiedByDefault="true"

в xml-файле

Я использую 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;
    }
});

для Appcompat Searchview вы можете использовать этот метод:

MenuItemCompat.expandActionView(mSearchMenuItem);