Race-Bedingung mit Android-Fragment-Backstack-Hörer geändert?Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Race-Bedingung mit Android-Fragment-Backstack-Hörer geändert?

Post by Anonymous »

Ich habe in meiner Hauptaktivität einen Code, der so aussieht:

Code: Select all

class MainActivity : AppCompatActivity() {
private val backStackListener = FragmentManager.OnBackStackChangedListener {
val backStackEntryCount = getSupportFragmentManager().backStackEntryCount

Log.e(TAG, "back stack count = " + backStackEntryCount.toString())

if (backStackEntryCount > 0) {
this.getSupportActionBar()?.setDisplayHomeAsUpEnabled(true)
this.getSupportActionBar()?.setDisplayShowHomeEnabled(true)
} else {
this.getSupportActionBar()?.setDisplayHomeAsUpEnabled(false)
this.getSupportActionBar()?.setDisplayShowHomeEnabled(false)
}
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.getItemId()){
android.R.id.home -> {
onBackPressedDispatcher.onBackPressed()
return true
}
}

return super.onOptionsItemSelected(item)
}

override fun onCreate(savedInstanceState: Bundle?) {
...
getSupportFragmentManager().addOnBackStackChangedListener(backStackListener)
...
if (buttonClicked) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container_view,fragment_a).commit()
}
}
Dann in Fragment A:

Code: Select all

...
requireActivity().getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container_view,fragment_b).addToBackStack(null).commit()
Wenn ich in der Hauptaktivität von Fragment A -> Fragment B navigiere, sieht der hintere Stapel so aus, wie man es erwarten würde, d. h. es gibt ein einzelnes Element im hinteren Stapel. Wenn ich dann auf die Home-Schaltfläche klicke, wird das Element korrekt aus dem hinteren Stapel entfernt und meine Protokollmeldung wird gedruckt:

Code: Select all

back stack count = 0
Wenn ich jedoch die Wischgeste verwende, springt sie zwar korrekt zu Fragment A zurück, aber stattdessen erhalte ich Folgendes:

Code: Select all

back stack count = 1
Ich habe später überprüft, dass der Backstack schließlich auf 0 geht, aber es scheint, dass der Backstack-Änderungs-Listener aufgerufen wird, bevor das Fragment vom Stack entfernt wird. Ist das erwartetes Verhalten? Gibt es eine Möglichkeit, dies zu umgehen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post