为什么 RequireView() 不是 return 视图 onResume()?
Why doesn't RequireView() not return a view onResume()?
我正在片段的 onResume() 方法上使用 Volley Request 解析数据,以使用解析后的数据填充布局,我需要获取片段的视图,这就是我调用 requireView( ) onResume() 成功解析后。
这是我的应用程序第一次在一行上崩溃,我将用 * 标记:
java.lang.IllegalStateException: Fragment DataMain{1a53f20}
(4f68cb4d-c05f-4416-932e-26e455fbf106)} did not return a View from
onCreateView() or this was called before onCreateView().
这是代码:
class DataMain : Fragment(), CoroutineScope by MainScope() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_Data, container, false)
DataBalance = view.findViewById(R.id.Data_balance)
// Firebase User Auth
getUID.requestUidToken()?.addOnSuccessListener {
}?.addOnFailureListener {
val unregisteredView = inflater.inflate(R.layout.fragment_unregistred, container, false)
val registerNow = unregisteredView.findViewById<TextView>(R.id.textview_registernow)
registerNow.setOnClickListener {
val mIntent = Intent(activity, LoginMain::class.java)
requireActivity().startActivity(mIntent)
}
}
view
} else {
val unregisteredView = inflater.inflate(R.layout.fragment_unregistred, container, false)
val registerNow = unregisteredView.findViewById<TextView>(R.id.textview_registernow)
registerNow.setOnClickListener {
val mIntent = Intent(activity, LoginMain::class.java)
requireActivity().startActivity(mIntent)
}
unregisteredView
}
}
private fun populateDataLayout(res: JSONObject, view: View) {
val response = Gson().fromJson(res.toString(), ServerResponse::class.java)
//here I need the view
val lVDataMenu: ListView = view.findViewById(R.id.lV_DataMenu)
lVDataMenu.adapter = lVadapter
else if (response.code == 403) {
}
}
override fun onResume() {
getUID.requestUidToken()?.addOnSuccessListener { getTokenResult ->
Volley(config.DATA_LOADDATA, { res ->
**CRASH**populateDataLayout(res,requireView())
}, {
tv_unverified.visibility = View.VISIBLE
})
}
super.onResume()
}
我可以在 populate Routine 中去掉 "view.findViewById(R.id.lV_DataMenu)" 的使用,但是我不明白这里的问题。
我无法重新创建错误,所以这就是我问的原因。那么为什么 requireView() 可能没有 return 视图?是因为用户切换到下一个片段而 Volley 还没有完成解析吗?我该如何解决?
override fun onResume() {
getUID.requestUidToken()?.addOnSuccessListener { getTokenResult ->
Volley(config.DATA_LOADDATA, { res ->
**CRASH**populateDataLayout(res,requireView())
}, {
tv_unverified.visibility = View.VISIBLE
})
}
您没有在 onResume()
中呼叫 requireView()
。
您有两个异步调用,并且将函数({}
中的那些 lambda 表达式)作为参数传递给它们。这些函数稍后调用,例如当异步操作完成时。那时你的片段可能已经完成了它的生命周期。
两种常见的处理策略:
片段完成时取消挂起的异步调用。您似乎在 onCreateView()
和 onResume()
中触发了调用。它们的生命周期对应物是 onDestroyView()
和 onPause()
。具体如何执行此操作取决于您使用的异步 API。
带陈旧性检查的即发即弃:异步完成后,检查片段是否仍然存在,否则什么都不做。例如,更改
populateDataLayout(res,requireView())
类似于
view?.let { populateataLayout(res, it) }
其中 view
是非空 requireView()
.
的可空 getView()
对应物
我正在片段的 onResume() 方法上使用 Volley Request 解析数据,以使用解析后的数据填充布局,我需要获取片段的视图,这就是我调用 requireView( ) onResume() 成功解析后。 这是我的应用程序第一次在一行上崩溃,我将用 * 标记:
java.lang.IllegalStateException: Fragment DataMain{1a53f20} (4f68cb4d-c05f-4416-932e-26e455fbf106)} did not return a View from onCreateView() or this was called before onCreateView().
这是代码:
class DataMain : Fragment(), CoroutineScope by MainScope() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_Data, container, false)
DataBalance = view.findViewById(R.id.Data_balance)
// Firebase User Auth
getUID.requestUidToken()?.addOnSuccessListener {
}?.addOnFailureListener {
val unregisteredView = inflater.inflate(R.layout.fragment_unregistred, container, false)
val registerNow = unregisteredView.findViewById<TextView>(R.id.textview_registernow)
registerNow.setOnClickListener {
val mIntent = Intent(activity, LoginMain::class.java)
requireActivity().startActivity(mIntent)
}
}
view
} else {
val unregisteredView = inflater.inflate(R.layout.fragment_unregistred, container, false)
val registerNow = unregisteredView.findViewById<TextView>(R.id.textview_registernow)
registerNow.setOnClickListener {
val mIntent = Intent(activity, LoginMain::class.java)
requireActivity().startActivity(mIntent)
}
unregisteredView
}
}
private fun populateDataLayout(res: JSONObject, view: View) {
val response = Gson().fromJson(res.toString(), ServerResponse::class.java)
//here I need the view
val lVDataMenu: ListView = view.findViewById(R.id.lV_DataMenu)
lVDataMenu.adapter = lVadapter
else if (response.code == 403) {
}
}
override fun onResume() {
getUID.requestUidToken()?.addOnSuccessListener { getTokenResult ->
Volley(config.DATA_LOADDATA, { res ->
**CRASH**populateDataLayout(res,requireView())
}, {
tv_unverified.visibility = View.VISIBLE
})
}
super.onResume()
}
我可以在 populate Routine 中去掉 "view.findViewById(R.id.lV_DataMenu)" 的使用,但是我不明白这里的问题。 我无法重新创建错误,所以这就是我问的原因。那么为什么 requireView() 可能没有 return 视图?是因为用户切换到下一个片段而 Volley 还没有完成解析吗?我该如何解决?
override fun onResume() { getUID.requestUidToken()?.addOnSuccessListener { getTokenResult -> Volley(config.DATA_LOADDATA, { res -> **CRASH**populateDataLayout(res,requireView()) }, { tv_unverified.visibility = View.VISIBLE }) }
您没有在 onResume()
中呼叫 requireView()
。
您有两个异步调用,并且将函数({}
中的那些 lambda 表达式)作为参数传递给它们。这些函数稍后调用,例如当异步操作完成时。那时你的片段可能已经完成了它的生命周期。
两种常见的处理策略:
片段完成时取消挂起的异步调用。您似乎在
onCreateView()
和onResume()
中触发了调用。它们的生命周期对应物是onDestroyView()
和onPause()
。具体如何执行此操作取决于您使用的异步 API。带陈旧性检查的即发即弃:异步完成后,检查片段是否仍然存在,否则什么都不做。例如,更改
populateDataLayout(res,requireView())
类似于
view?.let { populateataLayout(res, it) }
其中
view
是非空requireView()
. 的可空
getView()
对应物