Расширьте и сделайте акцент на 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
эти две ситуации работают для меня.
Для 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);
использовать ширину экрана вместо ххх