【发布时间】:2018-03-01 13:40:19
【问题描述】:
我正在使用 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 不能为空。
该变量在屏幕旋转时为空。如何解决这个问题?
片段代码
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()
}
}
重现步骤:
- 开始活动
- 片段被加载
- 在片段加载时,我加载一个 URL 并显示一个进度条
- 在加载 URL 时,我旋转手机,进度条变量变为空
【问题讨论】:
-
通过Id获取progress_bar的方法是什么?请考虑片段状态生命周期。也许您在视图尚未准备好时尝试加载它。参考这里developer.android.com/guide/components/fragments.html
-
@BrunoBieri 我在 onCreateView() 但在“返回视图”语句之前调用。因此,变量没有被分配。现在,我正在访问“view.progress_bar”之类的“progress_bar”,问题就解决了。谢谢。
-
你应该在
onViewCreated这样做 -
谢谢@MichałBaran,我会关注的
-
@BrunoBieri 该变量是由 kotlin android 扩展分配的,我们不需要在其中初始化视图变量。我的问题由 setRetainInstance(true) 解决
标签: android kotlin kotlin-android-extensions