我正在Kotlin应用程序中使用AppIntro,需要自定义其布局。教程告诉我们使用此代码作为起点。因为这是用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\u LAYOUT\u RES\u ID
如何解决这个问题?
companion对象
块中的变量和函数基本上是静态的(如果要从Java中进行并行处理)。
ARG\u LAYOUT\u RES\u ID
变量不在伴生对象
范围内,因此无法静态访问它。
将ARG_LAYOUT_RES_ID
变量移动到伴随对象
范围内,一切都会恢复正常。
将字段移动到您的同伴对象:
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
}
}
这是因为ARG\u LAYOUT\u RES\u 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\u LAYOUT\u RES\u ID
aconst
。
我有如下java代码: 我使用Android Studio选项“转换为Kotlin”对其进行了转换 下面是它的外观: IDE现在在这里强调了'add'方法: 它说: 未解决的引用:添加 我怎样才能解决这个问题? 更新: 这是我的转换函数: 示例用法:
我试图使用新的相机硬件API(android.hardware.camera2)的示例代码为我的Android应用程序。首先,我通过Android Studio的静态编程语言插件的自动转换功能将Java代码转换为静态编程语言代码。下面是一段转换后的代码: 我得到了未解决的引用错误: 但是这些常数在原始Java代码中是可以识别的。这些错误有什么解决办法吗?
我一直得到错误"未解决的引用:绑定"。有人知道我错过了什么吗?我已经试着更新了一切。但是绑定不起作用。 建筑格拉德尔。(module.app):
我试图将我的android项目迁移到使用gradle kotlin dsl,将所有的build.gradle文件替换为build.gradle.kts文件,并在那里使用kotlin。以前,我曾经有一个kotlin文件,其中包含具有库和版本常量的对象元素(在buildSrc->src->main->kotlin中),例如:
这一行: 给我错误。 我的项目创建过程非常基本:在Intellij idea中: