Розширте та зосередьте увагу на SearchView автоматично


74

Я розробляю програму, де користувач натискає на піктограму "Пошук" у, ActionBarа a SearchViewробиться видимою у верхній частині екрана.

Моя проблема полягає в тому, що SearchViewвін не знаходиться у фокусі та не розширений, тому користувач повинен натиснути кнопку пошуку на, Searchviewщоб розширити та вивести клавіатуру.

Як це слід вирішити?

Відповіді:


96

Щоб зробити SearchView розширеним за замовчуванням, зателефонуйте setIconifiedByDefault (false) на ньому під час ініціалізації (наприклад, у onCreateOptionsMenu(..)або onPrepareOptionsMenu(..)). Я виявив, що в більшості випадків це автоматично фокусується на ньому, але якщо не просто просто зателефонуйте requestFocus().


5
Я не впевнена бути чесною, вибачте.
Alex Curran,

8
Додавання requestFocus()дзвінка onPrepareOptionsMenu(..)зробило для мене фокус.
Брудний кальвініст

3
requestFocusне працює для мене. Для "фокусування" ви можете зателефонувати за setIconifiedдопомогоюfalse
peterchaula

1
@SweSnow Ви повинні встановити обидва ... searchView.setIconifiedByDefault (false); searchView.requestFocus ();
pallav bohara

3
обов’язково встановіть властивість пункту меню app:showAsAction="always". Коли я вилучив автофокус, піктограма зникла і з’явилася піктограма з трьома крапками
Ріккардо Бонезі

113

Ви також можете викликати метод 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"
        />

47
Якщо ви використовуєте AppCompat , замість виклику expandActionView()безпосередньо на searchMenuItem, ви повинні використовувати замість цього: MenuItemCompat.expandActionView(searchMenuItem).
Charles Madere

@CharlesMadere way - єдиний, хто працював у мене, API 23
Маттео

плюс 1 заsearchMenuItem.expandActionView();
Влад

2
MenuItemCompat.expandActionView (searchMenuItem) застаріло зараз
luckyhandler

Це рішення застаріло.
Фелікс Фавор Чинемерем,

55

Якщо ви хочете його мати 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();

25

Якщо ви використовуєте його в макеті, ви можете зателефонувати

mSearchView.onActionViewExpanded()


Що означає використання в макеті?
Паскалій

3
Я маю на увазі, що ви посилаєтесь на це як на View, а неMenuItem
riwnodennyk

це не спрацювало для мене. Виклик setIconified () все-таки зробив.
MrPlow

працював у мене теж, я не впевнений, чому на офіційному веб-сайті вони не включені в зразок коду. Я маю на увазі, якщо я натискаю на кнопку пошуку, клавіатура повинна відкритися правильно ???
Тушар Шрівастава,

8

Це спрацювало для мене:

У кореневій розкладці:

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"

6

Якщо ви використовуєте внутрішню діяльність, яку вам потрібно використовувати

view.onActionViewExpanded();

якщо ви використовуєте внутрішні опції меню, які вам потрібно використовувати

MenuItem.expandActionView();

Примітка: він працює лише для SearchView

ці дві ситуації працюють для мене.



2

Ви можете використовувати 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)


2

використовуй це

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

2

Для Appcompat Searchview ви можете використовувати цей метод:

MenuItemCompat.expandActionView(mSearchMenuItem);

1

Відповідь @ Паскалія спрацювала для мене. Але кожного разу, коли ви закриваєте 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;
    }
});

0

SearchView MenuItemCompat має властивість maxWidth.

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

використовувати ширину екрана замість xxx offcourse


0

Я використовую 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"/>

0

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


Це успішно працює для мене, так що ви можете спробувати.
chandan raj


0

Мені було важко робити це SearchView widget, але expandActionView() methodце насправді визначено в класі MenuItem, а не в класі SearchView. Отже, я це вирішив

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

Сподіваюся, це допоможе. :)


-2

android:iconifiedByDefault="true"

Вище наведено код у XML, який допоміг мені розширити його та виконати автофокус у поданні пошуку при натисканні:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.