PresentationFragment медленно раздувается в android

MyActivity - это...

   private var preso: ClientResultPresentationFragment? = null
   private var presoHelper: PresentationHelper? = null

   private val presoListener = object: PresentationHelper.Listener{
        override fun initSecondDisplay(display: Display?) {
            Log.d("preso", "initSecondDisplay()")
            preso = MytPresentationFragment.newInstance(this@MyActivity, display)
            preso!!.show(fragmentManager, PRESO) // PRESO is a static value.
        }

        override fun clearPreso(switchToInline: Boolean) {
            if (preso != null) {
                preso!!.dismiss()
                preso = null
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_my)

        // Must open second display at the same time.
        onCreatePreso()

        refinedResultData = intent.extras!!.getParcelable(RESULT_DATA)
        Log.d("result", "${resultData.toString()}")
        init(resultData!!)
    }

    private fun init(data: ResultData){
        initView(data)
        preso!!.syncData(data)
    }

    private initView(data: ResultData){
        // TODO: initViews...
    }

    private fun onCreatePreso(){
        presoHelper = PresentationHelper(this, presoListener)
        presoHelper!!.enable()
    }

    override fun onResume() {
        super.onResume()
        presoHelper?.onResume()
    }

    override fun onPause() {
        presoHelper?.onPause()
        super.onPause()
    }

Мой фрагмент презентации...

    var mView: View? = null

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        Log.d("preso", "onCreateView()")
        
        mView = LayoutInflater.from(context).inflate(R.layout.fragment_my, container, false)
        return mView
    }

    fun syncData(data: ResultData){
        Log.d("preso", "syncData()->${data.toString()}")
        initView()

        // return >>> here...

        mView!!.tv_title.text = "${data.title}" // <<< crash here >>>
        // TODO: set initial data
    }

    fun initView(){
        // initViews...
    }

    companion object {
        fun newInstance(context: Context?, display: Display?): MyPresentationFragment {
            val frag = MyPresentationFragment()
            
            frag.setDisplay(context, display)

            return frag
        }
    }

А журнал...

"resultData.toString()"
initSecondDisplay()
"syncData()->${data.toString()}"
crash------------------

если я просто раскомментирую возвращаемую часть в syncData() фрагмента презентации (он не получит доступ к представлениям)

"resultData.toString()"
initSecondDisplay()
"syncData()->${data.toString()}"
onCreateView()

Так, syncData() называется раньше, чем onCreateView(). Что я должен делать? я переехал preso!!.syncData() после preso!!.show(fragmentManager, PRESO) и это то же самое.

1 ответ

Поскольку FragmentManager операции является асинхронным, вы должны отправить обратный вызов из своего фрагмента в действие во фрагменте OnViewCreated или, может быть OnResumeи только потом отправляем данные из активности во фрагмент. Или вы можете просто использовать ViewModel и LiveData предоставить ваши данные фрагментам

Другие вопросы по тегам