Автоматическое преобразование Java в Kotlin: неразрешенная ссылка на 'ARG_LAYOUT_RES_ID' - PullRequest
0 голосов
/ 29 мая 2018

Я использую AppIntro в своем приложении Kotlin, и мне нужно настроить его макет.Учебник говорит нам использовать этот код в качестве отправной точки.Поскольку он написан на Java, я преобразовал его в Kotlin (хотя не на 100% автоматизирован, поскольку Kotlin не поддерживает ключевое слово static):

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 голосов
/ 29 мая 2018

Переместите поле на объект-компаньон:

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
    }
}
0 голосов
/ 29 мая 2018

Это потому, что 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, как я показал выше.

0 голосов
/ 29 мая 2018

Переменные и функции внутри блока companion object в основном статичны (если вы проводите параллели из Java).

Переменная ARG_LAYOUT_RES_ID не находится внутри области действия companion object, поэтому она можетк статическому доступу.

Переместите переменную ARG_LAYOUT_RES_ID в область действия companion object, и все снова будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...