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
предоставить ваши данные фрагментам