onBackPressed() veraltet, was ist die Alternative?

Lesezeit: 4 Minuten

Benutzeravatar von Rumit Patel
Rumit Patel

Ich habe ein Upgrade durchgeführt targetSdkVersion und compileSdkVersion zu 33.

Jetzt wird gewarnt onBackPressed ist veraltet.

Es wird empfohlen, zu verwenden OnBackInvokedCallback oder androidx.activity.OnBackPressedCallback um stattdessen die Rückwärtsnavigation zu behandeln. Jeder kann mir helfen, die aktualisierte Methode zu verwenden.

Beispiel:

onBackPressedVeraltet

Anwendungsfall: ich benutze if (isTaskRoot) {} Innerhalb onBackPressed(){} Die Methode zum Überprüfen der Aktivität ist die letzte auf dem Aktivitätsstapel.

override fun onBackPressed() {
    if (isTaskRoot) { // Check this activity is last on the activity-stack.(Check Whether This activity opened from Push-Notification)
        startActivity(Intent(mContext, Dashboard::class.java))
        finish()
    } else {
        finishWithResultOK()
    }
}

  • Wenn Sie nur anrufen super.onBackPressed(), dann können Sie die Methode einfach vollständig entfernen, da Sie kein benutzerdefiniertes Back-Verhalten schreiben. Wenn du sind Benutzerdefiniertes Back-Verhalten schreiben, zeigen Sie Ihren Code.

    – ianhanniballake

    15. Juni um 16:19 Uhr

  • @ianhanniballake , ich benutze if (isTaskRoot) {} Innerhalb onBackPressed() zu überprüfende Aktivität ist die letzte auf dem Aktivitätsstapel. Ich habe die Frage auch aktualisiert.

    – Rumit Patel

    23. Juni um 13:08 Uhr

  • Sie sollten dies auf keiner API-Ebene tun. Bitte geben Sie Ihren Code an.

    – ianhanniballake

    23. Juni um 13:27 Uhr

  • Durch Klicken auf die Push-Benachrichtigung öffnet sich die Produktdetailseite. Wenn die App geschlossen ist, gelangt der Benutzer nun auf die Produktdetailseite, indem er auf Push-Benachrichtigung klickt. Wenn Sie dann auf Backpress klicken, sollte der Benutzer die App nicht direkt verlassen. für diesen Fall verwende ich onBackPressed().

    – Rumit Patel

    23. Juni um 14:36 ​​Uhr

  • Hast du das herausgefunden isTaskRoot bedingt? Die meisten Antworten scheinen sich sehr auf triviale Anwendungsfälle zu konzentrieren.

    – TWiStErRob

    9. Oktober um 21:03 Uhr

Benutzeravatar von Zain
Zain

Gemäß Ihrem API-Level-Register:

Dies erfordert mindestens zu verwenden appcompat:1.6.0-alpha03; der Strom ist 1.6.0-alpha04:

 implementation 'androidx.appcompat:appcompat:1.6.0-alpha04'
// kotlin
import androidx.activity.addCallback

if (BuildCompat.isAtLeastT()) {
    onBackInvokedDispatcher.registerOnBackInvokedCallback(
        OnBackInvokedDispatcher.PRIORITY_DEFAULT
    ) {
        // Back is pressed... Finishing the activity
        finish()
    }
} else {
    onBackPressedDispatcher.addCallback(this /* lifecycle owner */, object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            // Back is pressed... Finishing the activity
            finish()
        }
    })
}

AKTUALISIEREN:

Danke an den Kommentar von @ianhanniballake; kannst du einfach verwenden OnBackPressedDispatcher sogar in API-Level 33+

Der OnBackPressedDispatcher verwendet bereits intern die Android T-spezifische API, wenn Activity 1.6+ verwendet wird.

Sie können also einfach Folgendes tun:

// kotlin
import androidx.activity.addCallback

onBackPressedDispatcher.addCallback(this /* lifecycle owner */, object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        // Back is pressed... Finishing the activity
        finish()
    }
})
// java
import androidx.activity.OnBackPressedCallback;

getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
    @Override
    public void handleOnBackPressed() {
        // Back is pressed... Finishing the activity
        finish();
    }
});

Beachten Sie, dass Sie die nicht überschreiben sollten onBackPressed() wie das machen wird onBackPressedDispatcher Rückruf nicht zu feuern; Überprüfen Sie diese Antwort, um dies zu verdeutlichen.

  • Das OnBackPressedDispatcher wird bereits intern die Android T-spezifische API verwenden, wenn Activity 1.6+ verwendet wird, daher gibt es absolut keinen Grund, die Android T-APIs jemals direkt zu verwenden – Sie können einfach die verwenden OnBackPressedDispatcher auf allen API-Ebenen.

    – ianhanniballake

    15. Juni um 16:46 Uhr

  • Das Problem, das ich hier sehe, ist, dass Sie jetzt zwei Möglichkeiten haben, mit der Gegenpresse umzugehen, was etwas chaotisch ist. Gibt es eine Möglichkeit, das Überschreiben des alten einzuschränken? onBackPressed?

    – Bitweise DEVS

    25. Juni um 22:02 Uhr

  • Wie kann ich aufrufen OnBackPressedCallback handleOnBackPressed sagen wir programmgesteuert, ich habe eine Schaltfläche, die anrufen muss onBackPressed() programmatisch?

    – Bitweise DEVS

    25. Juni um 22:14 Uhr


  • @BitwiseDEVS AFAIK, immer noch onBackPressed() Entwicklern ausgesetzt; bei einigen neueren APIs sollte dies nicht der Fall sein; aber beide gleichzeitig zu handhaben ist nicht so richtig wie die Note am Ende der Antwort.

    – Zain

    27. Juni um 22:20 Uhr


  • @Zain Es war meine Schuld: Ich habe Activity statt AppCompatActivity erweitert. Es tut uns leid!

    – Luis A. Florit

    16. Oktober um 0:48 Uhr

Ersetzen Sie onBackPressed() durch den folgenden Code.

onBackPressedDispatcher.onBackPressed()

  • Einfach & sauber!

    – Rajesh Koshti

    8. November um 10:03 Uhr

Benutzeravatar von AIShakil
AIShakil

Mit einer Kombination aus Top-Antworten. Hier ist eine Lösung:

1. Wenn Sie die Zurück-Taste drücken müssen, kopieren Sie Folgendes:

Hinweis: Ihre Aktivität wird automatisch zerstört.

button.setOnClickListener {
    onBackPressedDispatcher.onBackPressed()
}

2. Wenn Sie mit der gedrückten Zurück-Taste umgehen müssen, kopieren Sie Folgendes:

onBackPressedDispatcher.addCallback(this, object: OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        // Whatever you want
        // when back pressed
        println("Back button pressed")
        finish()
    }
})

Benutzeravatar von Yasiru Nayanajith
Yasiru Nayanajith

Du könntest die verwenden onBackPressedDispatcher

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

hier bedeutet “this” den LifeCycleOwner

Benutzeravatar von Abel Makanzu Kinkela
Abel Makanzu Kinkela

Sie können den OnBackInvokedCallback verwenden

OnBackInvokedCallback wie in der Dokumentation beschrieben und befolgen Sie diese Anleitung hier um Ihren Code zu aktualisieren

Benutzeravatar von Mori
Mori

Im Kotlindieser Weg funktioniert

1- Entfernen onBackPressed()

2- unten onCreate(savedInstanceState: Bundle?) füge diese Zeilen hinzu:

 if (Build.VERSION.SDK_INT >= 33) {
        onBackInvokedDispatcher.registerOnBackInvokedCallback(
            OnBackInvokedDispatcher.PRIORITY_DEFAULT
        ) {
           
            exitOnBackPressed()
        }
    } else {
        onBackPressedDispatcher.addCallback(
            this,
            object : OnBackPressedCallback(true) {
                override fun handleOnBackPressed() {
                  
                    Log.i("TAG", "handleOnBackPressed: Exit")
                    exitOnBackPressed()
                }
            })
    }

3- Definieren Sie eine neue Funktion für die Handhabung

fun exitOnBackPressed() {
}

Benutzeravatar von Ananthakrishnan KR
Ananthakrishnan KR

Bonus: Um DrawerLayout zu schließen, wenn onBackPressed ist, verwenden Sie wie unten (gemäß dieses E/A-Gespräch),

val callback = onBackPressedDispatcher.addCallback(this, false) {
    binding.drawerLayout.closeDrawer(GravityCompat.START)
}
            
binding.drawerLayout.addDrawerListener(object : DrawerListener {  
        
    override fun onDrawerOpened(drawerView: View) {
        callback.isEnabled = true
    }
        
    override fun onDrawerClosed(drawerView: View) {
        callback.isEnabled = false
    }

    override fun onDrawerSlide(drawerView: View, slideOffset: Float) = Unit    
    override fun onDrawerStateChanged(newState: Int) = Unit
})

1436530cookie-checkonBackPressed() veraltet, was ist die Alternative?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy