Я переключил существующее приложение с фреймворка фрагмента на фреймворк проводника. Затем во время навигации у меня появилось поведение кнопки возврата (по меньшей мере, неожиданное). Вместо того, чтобы возвращаться к верхнему контроллеру стека при нажатии назад, приложение Возвращаясь ко второму верхнему контроллеру. Затем я создал небольшой проект, чтобы попытаться проверить, в чем моя проблема, как показано ниже. Давайте рассмотрим приложение с тремя контроллерами: -HomeController установлен как контроллер root -Первый контроллер -SecondController
Ожидаемая навигация должна быть следующей: 1) Запустите приложение и установите Home Controller как root. 2) С этого момента FirstController выталкивается, и backstack становится: HomeController, FirstController 3) Затем добавляется SecondController, и стек становится: HomeController, FirstController, SecondController 4) Нажата кнопка "Назад". FirstController отображается из backstack, и обратный ответ становится следующим: HomeController, FirstController
В общем, самая базовая c навигация, которую вы можете найти в Android. К сожалению, я понятия не имею, почему, когда я нажимаю кнопку возврата, происходит следующее: а) Первый контроллер показан на крошечный промежуток времени, как и должно быть б) Затем вызывается действие при нажатии на спину. Таким образом, это означает, что действие при обратном нажатии вызывается после того, как первый контроллер отображается из backstack. c) Затем, когда активность снова нажата, называется backstack, который появляется еще раз и попадает в HomeController
Ниже приведен весь мой след проблемы. Я разбил его, чтобы представить другую точку, описанную выше:
1)
D/Home Controller: On Create View
D/Home Controller: BackStack is:
D/Home Controller: com.paulhugon.myapplication.HomeController
D/Home Controller: On Attach android.widget.FrameLayout{ae7f861 V.E...... ......I. 0,0-0,0}
2)
D/First Controller: On Create View
D/First Controller: BackStack is:
D/First Controller: com.paulhugon.myapplication.HomeController
D/First Controller: com.paulhugon.myapplication.FirstController
D/First Controller: On Attach View android.widget.FrameLayout{525d636 V.E...... ......I. 0,0-0,0}
D/Home Controller: On Detach android.widget.FrameLayout{ae7f861 V.E...... .......D 0,0-1440,2112}
D/Home Controller: On Destroy View android.widget.FrameLayout{ae7f861 V.E...... .......D 0,0-1440,2112}
3)
D/Second Controller: On Create View
D/Second Controller: BackStack is:
D/Second Controller: com.paulhugon.myapplication.HomeController
D/Second Controller: com.paulhugon.myapplication.FirstController
D/Second Controller: com.paulhugon.myapplication.SecondController
D/Second Controller: On Attach android.widget.FrameLayout{ad6e51a V.E...... ......I. 0,0-0,0}
D/First Controller: On Detach android.widget.FrameLayout{525d636 V.E...... .......D 0,0-1440,2112}
D/First Controller: On Destroy View android.widget.FrameLayout{525d636 V.E...... .......D 0,0-1440,2112}
4)When back button is physically pressed
a)
D/First Controller: On Create View
D/First Controller: BackStack is:
D/First Controller: com.paulhugon.myapplication.HomeController
D/First Controller: com.paulhugon.myapplication.FirstController
D/First Controller: On Attach View android.widget.FrameLayout{49c4c35 V.E...... ......I. 0,0-0,0}
b)when back button is consumed
D/OnBackPressed: true
D/Second Controller: On Detach android.widget.FrameLayout{ad6e51a V.E...... ........ 0,0-1440,2112}
D/Second Controller: On Destroy View android.widget.FrameLayout{ad6e51a V.E...... ........ 0,0-1440,2112}
D/Second Controller: On Destroy
c)
D/Home Controller: On Create View
D/Home Controller: BackStack is:
D/Home Controller: com.paulhugon.myapplication.HomeController
D/Home Controller: On Attach android.widget.FrameLayout{dea1770 V.E...... ......I. 0,0-0,0}
D/First Controller: On Detach android.widget.FrameLayout{49c4c35 V.E...... .......D 0,0-1440,2112}
D/First Controller: On Destroy View android.widget.FrameLayout{49c4c35 V.E...... .......D 0,0-1440,2112}
D/First Controller: On Destroy
Ниже моего основного действия и моего домашнего контроллера. FirstController и SecondController идентичны HomeController:
class MainActivity : AppCompatActivity() {
lateinit var bindingActivity:ActivityMainBinding
private lateinit var router: Router
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bindingActivity = DataBindingUtil.setContentView(this, R.layout.activity_main)
router = Conductor.attachRouter(this,bindingActivity.controllerContainer,savedInstanceState)
if (!router.hasRootController()){
router.setRoot(RouterTransaction.with(HomeController()))
}
}
override fun onBackPressed() {
Log.d("OnBackPressed",router.handleBack().toString())
if(!router.handleBack()){
super.onBackPressed()
}
}
override fun onDestroy() {
bindingActivity.unbind()
super.onDestroy()
}
}
class HomeController:Controller {
constructor() : super()
constructor(args: Bundle?) : super(args)
companion object{
const val TAG = "Home Controller"
}
private lateinit var bindingHome:HomeControllerBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup,
savedViewState: Bundle?
): View {
Log.d(TAG,"On Create View")
bindingHome = DataBindingUtil.inflate(inflater,R.layout.home_controller,container,false)
val list = router.backstack
Log.d(TAG,"BackStack is:")
for(item in list){
Log.d(TAG,item.controller.javaClass.name)
}
bindingHome.buttonToNewReceipt.setOnClickListener {
router.pushController(RouterTransaction.with(FirstController())
.pushChangeHandler(HorizontalChangeHandler())
.popChangeHandler(HorizontalChangeHandler()))
}
return bindingHome.root
}
override fun onAttach(view: View) {
Log.d(TAG,"On Attach $view")
super.onAttach(view)
}
override fun onDetach(view: View) {
Log.d(TAG,"On Detach $view")
super.onDetach(view)
}
override fun onDestroyView(view: View) {
Log.d(TAG,"On Destroy View $view")
bindingHome.unbind()
super.onDestroyView(view)
}
override fun onDestroy() {
Log.d(TAG,"On Destroy")
super.onDestroy()
}
}
Мне здесь не хватает чего-то большого? Если у кого-нибудь есть идеи, я был бы рад это услышать, потому что уже двое суток мучает ...