PresentationFragment inflates slow in android

115 views Asked by At

MyActivity is...

   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()
    }

My Presentation Fragment is...

    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
        }
    }

And the log is...

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

if I just uncomment return part in syncData() of Presentation Fragment(It will not access the views)

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

So, syncData() is called earlier than onCreateView(). What should I do? I moved preso!!.syncData() after preso!!.show(fragmentManager, PRESO) and it's the same.

1

There are 1 answers

1
kronshtatov On

Since FragmentManager operations is async, you should send a callback from your fragment to the activity in the fragment OnViewCreated or maybe OnResume and only then send the data from the activity to the fragment. Or you can just use ViewModel and LiveData to provide your data to fragments