ฉันจะเปิด SearchView โดยใช้โปรแกรมได้อย่างไร


102

มีวิดเจ็ตนี้สำหรับ ActionBar ซึ่งเรียกว่า 'SearchView' เมื่อไม่ได้ใช้งานจะมีลักษณะดังนี้:

ใส่คำอธิบายภาพที่นี่

และเมื่อใช้งานจะมีลักษณะดังนี้:

ใส่คำอธิบายภาพที่นี่

ฉันต้องการ (แน่นอนโดยทางโปรแกรม) เปิดมุมมองการค้นหา (ทำให้เป็น "ใช้งานอยู่")

ฉันลองฟังก์ชั่นหลายอย่างเช่น:

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

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

แต่ไม่มีเลย ...

SearchView ใน XML:

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

คำตอบ:


255

ขยายSearchViewด้วย

searchView.setIconified(false);

และยุบด้วย

searchView.setIconified(true);

คุณจำเป็นต้องเปลี่ยนค่าของการandroid:showAsActionจากไปifRoom|collapseActionView แอตทริบิวต์ 's ควรจะเป็นซึ่งเป็นค่าเริ่มต้นมิฉะนั้นผู้ใช้ไม่สามารถยุบหลังจากที่มันถูกขยายโปรแกรมalwaysSearchViewandroid:iconifiedByDefaulttrueSearchView


15
สวัสดีแป้นพิมพ์ป๊อปอัป แต่ SearchView ไม่เปิดขึ้น
Eli Revah

1
สวัสดีนี่ยังใช้ไม่ได้ ฉันอัปเดตโพสต์ด้วยซอร์สโค้ด XML
Eli Revah

7
ผู้ชายที่คุณเป็นฮีโร่ f * king ของฉัน
Eliseo Ocampos

1
showAsAction = "always" จะแสดงแถบค้นหาแบบเต็มหน้าจอที่น่าเกลียดหลังจากการหมุนเวียน
Francesco Gabbrielli

1
showAsAction="always"ทำให้ไอคอนค้นหาอยู่บนแถบการทำงานเมื่อถูกขยายซึ่งจะไม่คล้ายกับลักษณะที่ปรากฏเมื่อโฟกัสการค้นหาด้วยตนเอง
Ixx

75

พยายามเรียกexpandActionView()ใช้ MenuItem ไม่ใช่ onActionViewExpanded () บน ActionView

มันใช้ได้กับฉัน

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

10
ทำงานได้สมบูรณ์แบบ แต่สำหรับ API> 14 เท่านั้นสำหรับ API รุ่นก่อนหน้านี้คุณสามารถใช้สิ่งนี้: MenuItemCompat.expandActionView (searchMenuItem);
Andrei Aulaska

นี่เป็นวิธีแก้ปัญหาที่ถูกต้อง - วิธีที่เลือกไว้บังคับให้คุณตั้งค่าshowAsAction: alwaysซึ่งทำให้เกิดปัญหาบางอย่าง
Ixx

13

หากคุณต้องการใช้ไลบรารีสนับสนุนเมื่อจำเป็นเท่านั้นให้ทำเช่นนี้

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

อื่น ๆ ก็ทำเช่นนี้

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

6

ฉันรู้ว่ามันสายไปแล้ว แต่

ลองเรียก expandActionView () เพื่อเปิดและยุบ ActionView () เพื่อปิด คุณสามารถเรียก requestFocus () บน Action View จริงผ่าน getActionView () เพื่อให้มุมมองการค้นหาโฟกัส :)


1

ขยายคำตอบของ Matthias Robberts:

ฉันต้องการให้ส่วนย่อยของรายการเก็บเป็นค่าการค้นหาและตั้งค่าหลังจากที่ผู้ใช้กลับมาจากส่วนอื่น ๆ

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

และสำหรับเมนูที่ฉันเก็บไว้always|collapseActionViewมิฉะนั้นจะยังคงเปิดอยู่เมื่อผู้ใช้ลบข้อความ


0

หากต้องการเปิดการsearchViewรักษาclose_buttonในท้ายที่สุดให้ใช้สิ่งนี้ในonCreate: -

searchView.findViewById(R.id.search_button).performClick();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.