自动Java到Kotlin转换:未解析的引用' ARG_LAYOUT_RES_ID'

时间:2018-05-29 14:44:17

标签: android kotlin

我在我的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

如何解决这个问题?

3 个答案:

答案 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范围内,一切都会好起来。