bluelinelabs / Conductor

A small, yet full-featured framework that allows building View-based Android applications
Apache License 2.0
3.9k stars 342 forks source link

Popping after pushing causes overlay #463

Closed PaulWoitaschek closed 6 years ago

PaulWoitaschek commented 6 years ago

When popping a controller (ControllerB) right after pushing another (ControllerC) , it does not get popped correctly. Instead the previous controller get's shown again. (ControllerA)

image

This bug was introduced in version 2.1.3 and is present in 2.1.4 and 2.1.5 too. In 2.1.2 everything works fine and the controllers just get replaced.

package de.paul_woitaschek.cbug

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.bluelinelabs.conductor.Conductor
import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.RouterTransaction
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler
import java.util.concurrent.atomic.AtomicBoolean

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val router =
      Conductor.attachRouter(this, findViewById(android.R.id.content), savedInstanceState)
    if (!router.hasRootController()) {
      val transaction = RouterTransaction.with(ControllerA())
      router.pushController(transaction)
    }
  }
}

class ControllerA : Controller() {

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup): View {
    return TextView(activity).also { textView ->
      textView.text  = "Controller A"
      textView.gravity = Gravity.CENTER_HORIZONTAL
      textView.setOnClickListener {
        val transaction = RouterTransaction.with(ControllerB())
        router.pushController(transaction)
      }
    }
  }
}

class ControllerB : Controller() {

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup): View {
    return TextView(activity).also { textView ->
      textView.text = "Controller B"
      textView.gravity = Gravity.START
      textView.setOnClickListener {
        val transaction = RouterTransaction.with(ControllerC())
        router.pushController(transaction)
        router.popController(this)
      }
    }
  }
}

class ControllerC : Controller() {

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup): View {
    return TextView(activity).also { textView ->
      textView.gravity = Gravity.END
      textView.text = "Controller C"
    }
  }
}
EricKuck commented 6 years ago

Checking this out now. Just wanted to say Conductor.attachRouter(this, findViewById(android.R.id.content), savedInstanceState) is genius! I don't know why I've never thought to do that…