ใช้มุมมองการดำเนินการและผู้ให้บริการการดำเนินการ

ลองใช้วิธีเขียน
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนําสําหรับ Android ดูวิธีเพิ่มคอมโพเนนต์ใน Compose

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 ระบุ หากแถบแอปมีพื้นที่ไม่เพียงพอ แอปจะเพิ่มการดำเนินการนั้นลงในเมนูแบบเลื่อนลง

รูปภาพแสดงแถบค้นหาที่มีไอคอนนำหน้าและตามหลัง
รูปที่ 1 แถบค้นหาที่มีไอคอนขึ้นต้นและต่อท้าย

เมื่อผู้ใช้แตะไอคอนหรือรายการเมนู วิดเจ็ตจะขยายเพื่อเติมเต็มแถบเครื่องมือ ซึ่งช่วยให้ผู้ใช้โต้ตอบกับวิดเจ็ตได้

รูปภาพที่แสดงมุมมองการค้นหาที่เปิดขึ้นเมื่อโฟกัสแถบค้นหา
รูปที่ 2 มุมมองการค้นหาจะเปิดขึ้นเมื่อโฟกัสที่แถบค้นหา

หากต้องการกําหนดค่าการดําเนินการ ให้ทําใน 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