我正在使用Kotlin Android Extension直接通过他们的ID访问视图。 我有一个进度条,我可以使用id,即progress_bar
直接访问片段<ProgressBar
android:id="@+id/progress_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="15dp"
android:indeterminate="true"/>
在片段中,我使用此代码显示并隐藏它
progress_bar.visibility = if (visible) View.VISIBLE else View.GONE
在旋转屏幕之前,它工作正常。之后,它抛出异常
java.lang.IllegalStateException:progress_bar不能为空。
变量在屏幕旋转时变为null。如何解决这个问题?
片段代码
class SingleAppFragment : Fragment() {
private lateinit var appName: String
companion object {
fun newInstance(appName: String = ""): SingleAppFragment {
val fragment = SingleAppFragment()
val args = Bundle()
args.putString(Constants.EXTRA_APP_NAME, appName)
fragment.arguments = args
return fragment
}
}
private var mListener: OnFragmentInteractionListener? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
appName = if (arguments != null && !arguments.getString(Constants.EXTRA_APP_NAME).isEmpty()) {
arguments.getString(Constants.EXTRA_APP_NAME)
} else {
Constants.APP_NAME_FACEBOOK
}
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater!!.inflate(R.layout.fragment_single_app, container, false)
}
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
setEventListeners()
}
private fun initView() {
var canShowSnackBar = true
web_single_app.webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
showHideProgressBar(true)
canShowSnackBar = true
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
showHideProgressBar(false)
}
override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) {
web_single_app.stopLoading()
if (canShowSnackBar) {
mListener?.onErrorWebView()
canShowSnackBar = false
}
}
}
web_single_app.settings.javaScriptEnabled = true
web_single_app.loadUrl(Constants.APP_NAME_URL_MAP[appName])
}
private fun setEventListeners() {
back_web_control.setOnClickListener({
web_single_app.goBack()
})
}
fun showHideProgressBar(visible: Boolean) {
progress_bar_web_control.visibility = if (visible) View.VISIBLE else View.GONE
}
fun loadUrl(appName: String) {
web_single_app.loadUrl(Constants.APP_NAME_URL_MAP[appName])
}
override fun onAttach(context: Context?) {
super.onAttach(context)
if (context is OnFragmentInteractionListener) {
mListener = context
}
}
override fun onDetach() {
super.onDetach()
mListener = null
}
interface OnFragmentInteractionListener {
fun onErrorWebView()
}
}
重现的步骤:
答案 0 :(得分:1)
您使用哪种方法获取progress_bar
ID?
请考虑片段状态lifecycle。也许您在视图尚未准备就绪时尝试加载它。
确保仅在视图准备好后分配progress_bar
变量。例如在
onViewCreated
方法。
请参见official Android lifecycle:
<强>更新强>
正如@CoolMind指出的那样,图表没有显示方法onViewCreated
。
可以找到完整的Android Activity / Fragment生命周期here:
答案 1 :(得分:1)
就我而言,此错误有时会发生。当然,onViewCreated()
是放置代码的好方法。但是有时奇怪的是,这还不够。 setRetainInstance(true)
可能有帮助,但可能没有帮助。因此,有时这会有所帮助:使用View
变量访问您的view
。您甚至可以在onCreateView()
中访问它们。您可以使用?.
来确保应用程序不会崩溃(当然,在这种情况下某些视图不会更新)。如果您希望获得context
,请使用view.context
。
就我而言,此错误仅在Kotlin协程中复制。
private fun showProgress(view: View) {
view.progressBar?.visibility = View.VISIBLE
}
private fun hideProgress(view: View) {
view.progressBar?.visibility = View.GONE
}
然后输入代码:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
showData(view)
}
private fun showData(view: View) {
showProgress(view)
adapter = SomeAdapter()
adapter.setItems(items)
val divider = SomeItemDecoration(view.context)
view.recycler_view?.run {
addItemDecoration(divider)
adapter = this@SomeFragment.adapter
layoutManager = LinearLayoutManager(view.context)
setHasFixedSize(true)
}
hideProgress(view)
}
答案 2 :(得分:0)
将retain intance true添加到片段中,以便在发生方向更改时不会将其销毁
from tensorflow.contrib.slim.python.slim.nets.inception_v3 import inception_v3
...
inputs = tf.random_uniform((batch_size, height, width, 3))
logits, end_points = inception_v3(inputs, num_classes)
在访问视图之前,还要使用安全调用操作符进行空检查
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance=true
}