Toolbar
ของไลบรารี AndroidX มีวิธีต่างๆ ในการโต้ตอบกับแอปสำหรับผู้ใช้ เพิ่มและจัดการการดำเนินการอธิบายวิธีกำหนดการดำเนินการ ซึ่งอาจเป็นปุ่มหรือรายการเมนู เอกสารนี้จะอธิบายวิธีเพิ่มคอมโพเนนต์อเนกประสงค์ 2 รายการต่อไปนี้
- มุมมองการทำงานคือการดําเนินการที่ให้ฟังก์ชันการทำงานที่หลากหลายภายในแถบแอป ตัวอย่างเช่น มุมมองการดำเนินการค้นหาช่วยให้ผู้ใช้พิมพ์ข้อความค้นหาในแถบแอปได้โดยไม่ต้องเปลี่ยนกิจกรรมหรือข้อมูลโค้ด
- ผู้ให้บริการการดำเนินการคือการดำเนินการที่มีเลย์เอาต์ที่กำหนดเอง การดำเนินการจะปรากฏเป็นปุ่มหรือรายการเมนูในตอนแรก เมื่อผู้ใช้แตะการดำเนินการ ผู้ให้บริการการดำเนินการจะควบคุมลักษณะการทํางานของการดำเนินการตามที่คุณกำหนด เช่น ผู้ให้บริการการดำเนินการอาจตอบสนองต่อการแตะโดยแสดงเมนู
AndroidX มีวิดเจ็ตมุมมองการดำเนินการและผู้ให้บริการการดำเนินการที่เฉพาะเจาะจงหลายรายการ เช่น วิตเจ็ต SearchView
ใช้มุมมองการดำเนินการสำหรับการป้อนคำค้นหา วิตเจ็ต ShareActionProvider
ใช้ผู้ให้บริการการดำเนินการเพื่อแชร์ข้อมูลกับแอปอื่นๆ นอกจากนี้ คุณยังกําหนดมุมมองการดําเนินการและผู้ให้บริการการดําเนินการของคุณเองได้ด้วย
เพิ่มมุมมองการดำเนินการ
หากต้องการเพิ่มมุมมองการดำเนินการ ให้สร้างองค์ประกอบ <item>
ในทรัพยากรเมนูของแถบเครื่องมือ ตามที่อธิบายไว้ในเพิ่มและจัดการการดำเนินการ เพิ่มแอตทริบิวต์ใดแอตทริบิวต์หนึ่งต่อไปนี้ลงในองค์ประกอบ <item>
actionViewClass
: คลาสวิดเจ็ตที่ใช้การดำเนินการactionLayout
: ทรัพยากรเลย์เอาต์ที่อธิบายองค์ประกอบของการดำเนินการ
ตั้งค่าแอตทริบิวต์ showAsAction
เป็น "ifRoom|collapseActionView"
หรือ "never|collapseActionView"
Flag collapseActionView
จะระบุวิธีแสดงวิดเจ็ตเมื่อผู้ใช้ไม่ได้โต้ตอบกับวิดเจ็ต หากวิดเจ็ตอยู่ในแถบแอป แอปจะแสดงวิดเจ็ตเป็นไอคอน หากวิดเจ็ตอยู่ในเมนูรายการเพิ่มเติม แอปจะแสดงวิดเจ็ตเป็นรายการเมนู เมื่อผู้ใช้โต้ตอบกับมุมมองการดำเนินการ มุมมองจะขยายให้เต็มแถบแอป
ตัวอย่างเช่น โค้ดต่อไปนี้จะเพิ่มวิดเจ็ต SearchView
ลงในแถบแอป
<item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@drawable/ic_search" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="androidx.appcompat.widget.SearchView" />
หากผู้ใช้ไม่ได้โต้ตอบกับวิดเจ็ต แอปจะแสดงวิดเจ็ตเป็นไอคอนที่ android:icon
ระบุ หากแถบแอปมีพื้นที่ไม่เพียงพอ แอปจะเพิ่มการดำเนินการนั้นลงในเมนูแบบเลื่อนลง
เมื่อผู้ใช้แตะไอคอนหรือรายการเมนู วิดเจ็ตจะขยายเพื่อเติมเต็มแถบเครื่องมือ ซึ่งช่วยให้ผู้ใช้โต้ตอบกับวิดเจ็ตได้
หากต้องการกําหนดค่าการดําเนินการ ให้ทําใน onCreateOptionsMenu()
callbacks ของกิจกรรม คุณรับการอ้างอิงออบเจ็กต์ของมุมมองการดำเนินการได้โดยเรียกใช้วิธี getActionView()
ตัวอย่างเช่น โค้ดต่อไปนี้จะรับการอ้างอิงออบเจ็กต์สําหรับวิดเจ็ต SearchView
ที่กําหนดไว้ในตัวอย่างโค้ดก่อนหน้า
Kotlin
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.main_activity_actions, menu) val searchItem = menu?.findItem(R.id.action_search) val searchView = searchItem?.actionView as SearchView // Configure the search info and add any event listeners. return super.onCreateOptionsMenu(menu) }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_activity_actions, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) searchItem.getActionView(); // Configure the search info and add any event listeners. return super.onCreateOptionsMenu(menu); }
ตอบสนองต่อการขยายมุมมองการดําเนินการ
หากองค์ประกอบ <item>
ของการดำเนินการมี Flag collapseActionView
แอปจะแสดงมุมมองการดำเนินการเป็นไอคอนจนกว่าผู้ใช้จะโต้ตอบกับมุมมองการดำเนินการ เมื่อผู้ใช้แตะไอคอน ตัวแฮนเดิลในตัวของ onOptionsItemSelected()
จะขยายมุมมองการดำเนินการ หากคลาสย่อยของกิจกรรมลบล้างเมธอด onOptionsItemSelected()
เมธอดลบล้างของคุณต้องเรียกใช้ super.onOptionsItemSelected()
เพื่อให้คลาสซุปเปอร์ขยายมุมมองการดำเนินการได้
หากต้องการดำเนินการบางอย่างเมื่อการดำเนินการขยายหรือยุบ คุณก็กำหนดคลาสที่ implements MenuItem.OnActionExpandListener
และส่งสมาชิกของคลาสนั้นไปยัง setOnActionExpandListener()
ได้
เช่น คุณอาจต้องการอัปเดตกิจกรรมโดยอิงตามสถานะการขยายหรือยุบมุมมองการดำเนินการ ข้อมูลโค้ดต่อไปนี้แสดงวิธีกําหนดและส่ง Listener
Kotlin
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.options, menu) // Define the listener. val expandListener = object : MenuItem.OnActionExpandListener { override fun onMenuItemActionCollapse(item: MenuItem): Boolean { // Do something when the action item collapses. return true // Return true to collapse the action view. } override fun onMenuItemActionExpand(item: MenuItem): Boolean { // Do something when it expands. return true // Return true to expand the action view. } } // Get the MenuItem for the action item. val actionMenuItem = menu?.findItem(R.id.myActionItem) // Assign the listener to that action item. actionMenuItem?.setOnActionExpandListener(expandListener) // For anything else you have to do when creating the options menu, // do the following: return true }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.options, menu); // Define the listener. OnActionExpandListener expandListener = new OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when the action item collapses. return true; // Return true to collapse action view. } @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do something when it expands. return true; // Return true to expand the action view. } }; // Get the MenuItem for the action item. MenuItem actionMenuItem = menu.findItem(R.id.myActionItem); // Assign the listener to that action item. MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener); // For anything else you have to do when creating the options menu, // do the following: return true; }
เพิ่มผู้ให้บริการการดำเนินการ
หากต้องการประกาศผู้ให้บริการการดำเนินการ ให้สร้างองค์ประกอบ <item>
ในแหล่งข้อมูลเมนูของแถบเครื่องมือ ตามที่อธิบายไว้ในเพิ่มและจัดการการดำเนินการ เพิ่มแอตทริบิวต์ actionProviderClass
แล้วตั้งค่าเป็นชื่อคลาสที่สมบูรณ์สำหรับคลาสผู้ให้บริการการดําเนินการ
ตัวอย่างเช่น โค้ดต่อไปนี้จะประกาศ ShareActionProvider
ซึ่งเป็นวิดเจ็ตที่กําหนดไว้ในคลัง AndroidX ซึ่งช่วยให้แอปแชร์ข้อมูลกับแอปอื่นๆ ได้
<item android:id="@+id/action_share" android:title="@string/share" app:showAsAction="ifRoom" app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>
ในกรณีนี้ คุณไม่จำเป็นต้องประกาศไอคอนสำหรับวิดเจ็ต เนื่องจาก
ShareActionProvider
มีกราฟิกของตัวเอง หากคุณใช้การดําเนินการที่กำหนดเอง ให้ประกาศไอคอน
แหล่งข้อมูลเพิ่มเติม
- ดูตัวอย่างการเพิ่มการดําเนินการแชร์ลงในแถบแอปด้านบนจาก
ShareActionProvider
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างผู้ให้บริการการดำเนินการที่กําหนดเองได้ที่
ActionProvider