我在我的Kotlin应用中使用AppIntro,需要自定义其布局。该教程告诉我们使用this code作为起点。因为那是用Java编写的,所以我将其转换为Kotlin(虽然不是100%自动化,因为Kotlin不支持静态关键字):
import android.support.v4.app.Fragment
import android.os.Bundle
import android.support.annotation.Nullable
import android.view.ViewGroup
import android.view.LayoutInflater
import android.view.View
class IntroFragment: Fragment() {
private val ARG_LAYOUT_RES_ID = "layoutResId"
private var layoutResId: Int = 0
companion object {
fun newInstance(layoutResId: Int): IntroFragment{
val args: Bundle = Bundle()
args.putSerializable(ARG_LAYOUT_RES_ID, layoutResId)
val fragment = IntroFragment()
fragment.arguments = args
return fragment
}
}
override fun onCreate(@Nullable savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null && arguments!!.containsKey(ARG_LAYOUT_RES_ID)) {
layoutResId = arguments!!.getInt(ARG_LAYOUT_RES_ID)
}
}
@Nullable
override fun onCreateView(inflater: LayoutInflater, @Nullable container: ViewGroup?,
@Nullable savedInstanceState: Bundle?): View? {
return inflater.inflate(layoutResId, container, false)
}
}
在这一部分:
args.putSerializable(ARG_LAYOUT_RES_ID, layoutResId)
Android Studio抱怨:
未解决的参考:ARG_LAYOUT_RES_ID
如何解决这个问题?
答案 0 :(得分:2)
这是因为ARG_LAYOUT_RES_ID
是一个实例变量,而你的newInstance
方法是一个类(静态)方法。
如果将ARG_LAYOUT_RES_ID
移动到随播对象中,它将起作用。像这样:
import android.support.v4.app.Fragment
import android.os.Bundle
import android.support.annotation.Nullable
import android.view.ViewGroup
import android.view.LayoutInflater
import android.view.View
class IntroFragment: Fragment() {
private var layoutResId: Int = 0
companion object {
private const val ARG_LAYOUT_RES_ID = "layoutResId"
fun newInstance(layoutResId: Int): IntroFragment {
val args: Bundle = Bundle()
args.putSerializable(ARG_LAYOUT_RES_ID, layoutResId)
val fragment = IntroFragment()
fragment.arguments = args
return fragment
}
}
override fun onCreate(@Nullable savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null && arguments!!.containsKey(ARG_LAYOUT_RES_ID)) {
layoutResId = arguments!!.getInt(ARG_LAYOUT_RES_ID)
}
}
@Nullable
override fun onCreateView(inflater: LayoutInflater,
@Nullable container: ViewGroup?,
@Nullable savedInstanceState: Bundle?): View? {
return inflater.inflate(layoutResId, container, false)
}
}
你也可以像我上面所示的那样ARG_LAYOUT_RES_ID
const
。
答案 1 :(得分:1)
将字段移动到您的伴侣对象:
companion object {
private val ARG_LAYOUT_RES_ID = "layoutResId"
fun newInstance(layoutResId: Int): IntroFragment{
val args: Bundle = Bundle()
args.putSerializable(ARG_LAYOUT_RES_ID, layoutResId)
val fragment = IntroFragment()
fragment.arguments = args
return fragment
}
}
答案 2 :(得分:0)
companion object
块内的变量和函数基本上是静态的(如果您要从Java中绘制相似的内容)。
ARG_LAYOUT_RES_ID
变量不在companion object
范围内,因此无法静态访问。
将ARG_LAYOUT_RES_ID
变量移到companion object
范围内,一切都会好起来。