ปุ่มย้อนกลับที่กำหนดเอง - ระบบนำทาง Android

ฉันมีแบบฟอร์มและต้องการรับข้อความยืนยันจากผู้ใช้ก่อนที่ผู้ใช้จะออกไป

ฉันต้องการให้ปุ่มย้อนกลับแบบกำหนดเองเมื่อผู้ใช้แตะปุ่มนี้:

ปุ่มย้อนกลับการนำทาง Android

ฉันลองสิ่งนี้:

val onBackPressedCallback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
            }
        }
requireActivity().onBackPressedDispatcher.addCallback(this,onBackPressedCallback)

แต่ดูเหมือนว่าจะใช้งานได้เพียงเพื่อให้พฤติกรรมการย้อนกลับแบบกำหนดเองกับปุ่มย้อนกลับของซอฟต์แวร์/ฮาร์ดแวร์ในตัวเท่านั้น ไม่ใช่ปุ่มลูกศรย้อนกลับ

ฉันจะทำเช่นนี้ได้อย่างไร?


comment
ใน java เราทำแบบนี้ stackoverflow.com/questions/36457564/ เพียงแปลงเป็น kotlin   -  person L2_Paver    schedule 14.10.2019


คำตอบ (3)


ใช้ onSupportNavigateUp และแทนที่ yourCurrentFragmentID เป็นรหัสส่วนปัจจุบันของคุณ ทั้งหมดนี้ควรทำใน MainActivity

 navController = findNavController(R.id.nav_host_fragment)

 setupActionBarWithNavController(navController!!)

 override fun onSupportNavigateUp(): Boolean {
        return when(navController?.currentDestination?.id) {
            R.id.yourCurrentFragmentID -> {
                showDialog()
                true
            }
            else -> navController?.navigateUp()!!
        }
    }

แก้ไข

หากแฟรกเมนต์ของคุณใช้ onOptionsItemSelected อยู่แล้ว คุณสามารถจัดการตรรกะได้โดยทำเครื่องหมายที่ itemId

 override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val id = item.itemId
        if (id == R.id.save) {
           // your save button code logic 
        }else if(id ==android.R.id.home){ 
            // display confirmation message
        }
        return super.onOptionsItemSelected(item)
    }
person John Joe    schedule 14.10.2019
comment
ขอบคุณ นี่คือปุ่มจัดการย้อนกลับ แต่ฉันควรทำอย่างไรหากต้องการดำเนินการบางอย่างที่ต้องใช้ข้อมูลแบบฟอร์มแฟรกเมนต์ - person peyman; 14.10.2019
comment
คุณหมายถึงคุณต้องการส่งข้อมูลส่วนไปยังข้อความยืนยันใช่ไหม - person John Joe; 14.10.2019
comment
ใช่ เช่น แสดงข้อมูลบางส่วนในกล่องโต้ตอบ หรือเรียกใช้ฟังก์ชันที่ต้องการข้อมูลในรูปแบบแฟรกเมนต์ - person peyman; 14.10.2019
comment
ขอบคุณ นี่คือสิ่งที่ฉันต้องการและทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง ฉันสามารถหยุดการทำงาน navController.navigateUp() ในส่วนย่อยได้หรือไม่ ฉันสามารถ navigateUp ด้วย findNavController().navigateUp() ได้ แต่ฉันจะหยุดมันได้อย่างไร - person peyman; 14.10.2019
comment
ขอโทษ มันเป็นความผิดพลาดจากฉัน ฉันต้องใช้รหัสเพื่อป้องกันการดำเนินการนำทางที่คุณโพสต์ก่อนหน้านี้ :) - person peyman; 14.10.2019
comment
คุณสามารถเพิกเฉยต่อคำตอบแรกของฉันได้ ใช้คำตอบที่สองดีพอที่จะไป - person John Joe; 14.10.2019
comment
ฉันหมายความว่าฉันต้องปิดการใช้งาน navigateUp สำหรับส่วนนี้ใน "กิจกรรม" เพราะเมื่อฉันคลิกที่กล่องโต้ตอบ back arrow icon จะปรากฏขึ้น และฉันกลับไปที่ส่วนก่อนหน้าในขณะที่กล่องโต้ตอบยังคงอยู่ตรงนั้น ถ้าฉันต้องการอยู่ในส่วนปัจจุบัน ฉันจะต้องปิดการใช้งาน navigateUp หรือสามารถทำได้ในส่วนย่อย? - person peyman; 14.10.2019
comment
ทำให้กลับไปยังส่วนก่อนหน้าหากกดปุ่มตกลงในกล่องโต้ตอบ มิฉะนั้นให้อยู่ในส่วนปัจจุบัน - person John Joe; 15.10.2019

ใช้รหัสนี้เพื่อตั้งค่ากิจกรรมบน backpress

override fun onBackPressed() {
        if (isDiscardChanges) {
            discardDialog()
        } else {

            super.onBackPressed()
        }
    }
person Chintan    schedule 14.10.2019

หากคุณต้องการกลับจาก Activity เท่านั้น คุณสามารถเพิ่มภายในกิจกรรมคลาสลูก AndroidManifest.xml ได้

android:parentActivityName="Parent_Activity_Name 
person rachna    schedule 14.10.2019