如何在Fragment
s中使用Kotlin Android扩展?如果我在onCreateView()
中使用它们,我会得到这个NullPointerException
异常:
原因: java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“”android.view.View android.view.View.findViewById()“”
以下是片段代码:
package com.obaied.testrun.Fragment
import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.obaied.acaan.R
import kotlinx.android.synthetic.main.fragment_card_selector.*
public class CardSelectorFragment : Fragment() {
val TAG = javaClass.canonicalName
companion object {
fun newInstance(): CardSelectorFragment {
return CardSelectorFragment()
}
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)
btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
return rootView
}
}
`
发布于 2015-12-31 16:01:56
Kotlin合成属性不是魔术,它的工作方式非常简单。当你访问btn_K
时,它会调用getView().findViewById(R.id.btn_K)
。
问题是你访问它的速度太快了。getView()
在onCreateView
中返回null
。尝试在onViewCreated
方法中执行此操作:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
}
发布于 2017-11-20 19:57:09
您调用此btn_K
的速度太快了,因为此时它返回一个null,并且给您提供了Null指针异常。
您可以通过在片段生命周期的onCreateView()
之后调用的onActivityCreated()
方法中的这个合成插件来使用这些视图。
onActivityCreated()
{
super.onActivityCreated(savedInstanceState)
btn_K.setOnClickListener{}
}
发布于 2018-08-03 22:03:17
由Kotlin Android Extensions plugin生成的合成属性需要事先为Fragment/Activity
设置一个view
。
在您的示例中,对于Fragment
,您需要在onViewCreated
中使用view.btn_K
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
val view = inflater.inflate(R.layout.fragment_card_selector, container, false)
view.btn_K.setOnClickListener{} // access with `view`
return view
}
或者更好,您应该只访问onViewCreated
中的合成属性
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.fragment_card_selector, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btn_K.setOnClickListener{} // access without `view`
}
请注意,savedInstanceState
参数应该是可以为空的Bundle?
,同时还要检查Importing synthetic properties
一次性导入特定布局的所有小部件属性非常方便:
import kotlinx.android.synthetic.main.<layout>.*
因此,如果布局文件名为activity_main.xml,我们将导入kotlinx.android.synthetic.main.activity_main.*.
如果我们想在视图上调用合成属性,我们还应该导入kotlinx.android.synthetic.main.activity_main.view.*.
https://stackoverflow.com/questions/34541650
复制相似问题