SearchView'ü programlı olarak nasıl açarım?


102

ActionBar için 'SearchView' adlı bir widget vardır. Kullanılmadığı zaman şöyle görünür:

görüntü açıklamasını buraya girin

Ve kullanımdayken şöyle görünür:

görüntü açıklamasını buraya girin

Arama görünümünü açmayı (elbette programlı olarak) istiyorum ("kullanımda" yapın).

Gibi birkaç işlevi denedim:

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setOnQueryTextListener(this);

    searchView.performClick();
    searchView.requestFocus();

Ama bunların hiçbiri işe yaramadı ...

XML'deki SearchView:

<item android:id="@+id/menu_search"
      android:title="Search"
      android:icon="@drawable/ic_action_search"
      android:showAsAction="ifRoom|collapseActionView"
      android:actionViewClass="android.widget.SearchView" />

Yanıtlar:


255

Expand SearchViewile

searchView.setIconified(false);

ve onu daralt

searchView.setIconified(true);

Sen değerini değiştirmek gerekir android:showAsActiondan ifRoom|collapseActionViewiçin always. SearchViewBireyin niteliği android:iconifiedByDefaultolmalıdır true, varsayılan değer olan, aksi takdirde kullanıcı daraltmak edemez SearchViewprogramlı genişletildi sonra.


15
Merhaba, bir klavye açılıyor ancak SearchView açılmıyor.
Eli Revah

1
Merhaba, bu da işe yaramadı. Yazıyı XML kaynak koduyla güncelledim.
Eli Revah

7
Adamım sen benim
lanet

1
showAsAction = "her zaman" çirkin bir tam ekran arama çubuğu gösterecek olsa da, döndürmeden sonra
Francesco Gabbrielli

1
showAsAction="always"genişlediğinde arama simgesinin işlem çubuğunda kalmasını sağlar; bu, aramaya manuel olarak odaklanırken görünüme benzemez.
Ixx

75

expandActionView()ActionView'da onActionViewExpanded () değil MenuItem'i çağırmayı deneyin .

Benim için çalışıyor.

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();

10
Mükemmel çalışır, ancak yalnızca API> 14 için çalışır. Önceki API için şunu kullanabilirsiniz: MenuItemCompat.expandActionView (searchMenuItem);
Andrei Aulaska

Bu doğru çözümdür - Seçilen çözüm sizi showAsAction: alwaysbazı sorunlara neden olan ayarlamaya zorlar .
Ixx

13

Destek kitaplığını yalnızca gerektiğinde kullanmak istiyorsanız, bunu yapın

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    if (Utils.hasIceCreamSandwich())
        searchMenuItem.expandActionView();
    else MenuItemCompat.expandActionView(searchMenuItem);

yoksa sadece bunu yap

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    MenuItemCompat.expandActionView(searchMenuItem);

6

Biliyorum geç oldu ama

Açmak için expandActionView () 'ı çağırmayı ve kapatmak için collapseActionView ()' ı çağırmayı deneyin. Arama görünümüne odaklanmak için getActionView () aracılığıyla gerçek Eylem Görünümünde requestFocus () 'u çağırabilirsiniz :)


1

Matthias Robberts'ın cevabını genişletmek:

Bir liste parçasının arama değerini korumasını ve kullanıcı diğer parçadan döndükten sonra ayarlamasını istedim.

if (myViewModel.filterTextSaved.isNotEmpty()) { // Kotlin, storing state in ViewModel
    searchItem.expandActionView() // needs to come first, otherwise empty text
    theTextArea.setText(courseViewModel.filterTextOnClick)
}

ve tuttuğum menü için always|collapseActionView, aksi halde kullanıcı metni sildiğinde açık kalıyor.


0

Sonunda bir searchViewtutmayı açmak için şunu close_buttonkullanın onCreate: -

searchView.findViewById(R.id.search_button).performClick();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.