Кнопка возврата не используется должным образом в проводнике - PullRequest
0 голосов
/ 25 мая 2020

Я переключил существующее приложение с фреймворка фрагмента на фреймворк проводника. Затем во время навигации у меня появилось поведение кнопки возврата (по меньшей мере, неожиданное). Вместо того, чтобы возвращаться к верхнему контроллеру стека при нажатии назад, приложение Возвращаясь ко второму верхнему контроллеру. Затем я создал небольшой проект, чтобы попытаться проверить, в чем моя проблема, как показано ниже. Давайте рассмотрим приложение с тремя контроллерами: -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()
    }
}

Мне здесь не хватает чего-то большого? Если у кого-нибудь есть идеи, я был бы рад это услышать, потому что уже двое суток мучает ...

...