Расширьте и сделайте акцент на SearchView автоматически

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

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

Как это должно быть решено?

19 ответов

Решение

Чтобы сделать 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 а также 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

эти две ситуации работают для меня.

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

menu.expandActionView();

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

MenuItemCompat.expandActionView(mSearchMenuItem);

Котлин

      var searchView = menu.findItem(R.id.action_search).actionView as SearchView
searchView.isIconified = true

Вы можете использовать SearchView#setIconified() метод на дескриптор SearchView в вашем коде Java. Больше здесь:

http://developer.android.com/reference/android/widget/SearchView.html

Вы также можете использовать SearchView#setIconifiedByDefault(), Больше информации здесь:

http://developer.android.com/reference/android/widget/SearchView.html

@ Ответ Паскалия сработал для меня. Но каждый раз, когда вы закрываете 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;
    }
});

Использовать этот

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

«android.widget.SearchView» ведет себя иначе, чем другие пункты меню. Поэтому вам следует использовать «setOnSearchClickListener», а не «OnMenuItemClickListener» или «onOptionsItemSelected».

      @Override
public boolean onCreateOptionsMenu(final Menu menu) {
    super.onCreateOptionsMenu(menu);
    final MenuItem menuItem = menu.findItem(R.id.search_menu_search_view);
    final SearchView searchView = (SearchView)menuItem.getActionView();
    searchView.setIconifiedByDefault(true);

    // Just like this!
    searchView.setOnSearchClickListener(view -> {
        view.requestFocus();
    });

    return true;
}

Вызов expandActionView() в меню Пункт.

menuItem.expandActionView()

Мне было трудно делать это с SearchView widget, но expandActionView() methodфактически определен в классе MenuItem, а не в классе SearchView. Итак, я решил это

        MenuItem searchItem = menu.findItem(R.id.item_search);
        SearchView   searchView = (SearchView) searchItem.getActionView();
        searchItem.expandActionView();

Я надеюсь, что это помогает.:)

 <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.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"/>

У SearchView MenuItemCompat есть свойство, названное maxWidth.

final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setMaxWidth(xxx);

использовать ширину экрана вместо ххх

android:iconifiedByDefault="true"

в вашем XML-файле

Другие вопросы по тегам