Android 如何在Kotlin类中声明公共值(val),以便稍后对其进行初始化。在这种特殊情况下不能使用var
我正在尝试使用Kotlin在Android上制作一个简单的摄像头应用程序。我无法将一些java代码转换为Kotlin。 我如何在Kotlin申报cameraDevice Java代码:Android 如何在Kotlin类中声明公共值(val),以便稍后对其进行初始化。在这种特殊情况下不能使用var,android,variables,kotlin,android-camera,android-camera2,Android,Variables,Kotlin,Android Camera,Android Camera2,我正在尝试使用Kotlin在Android上制作一个简单的摄像头应用程序。我无法将一些java代码转换为Kotlin。 我如何在Kotlin申报cameraDevice Java代码: class MainActivity extends AppCompatActivity{ protected CameraDevice cameraDevice; private final CameraDevice.StateCallback stateCallback = new CameraDev
class MainActivity extends AppCompatActivity{
protected CameraDevice cameraDevice;
private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
//This is called when the camera is open
cameraDevice = camera;
randomFunction();
}
@Override
public void onDisconnected(CameraDevice camera) {
cameraDevice.close();
}
@Override
public void onError(CameraDevice camera, int error) {
cameraDevice.close();
cameraDevice = null;
}
};
}
科特林代码:
class MainActivity : AppCompatActivity(){
val cameraDevice:CameraDevice?;
private val stateCallback: CameraDevice.StateCallback = object : CameraDevice.StateCallback() {
override fun onOpened(camera: CameraDevice) {
//This is called when the camera is open
cameraDevice = camera;
randomFunction();
}
override fun onDisconnected(camera: CameraDevice) {
cameraDevice.close();
}
override fun onError(camera: CameraDevice, error:Int) {
cameraDevice.close();
cameraDevice = null;
}
};
}
我无法将其定义为变量,它只在CameraDevice类型的可空接收器上抛出安全(?)或非空断言(!!)调用?
我不能在函数中声明它,抛出同样的错误 cameraDevice可以随时为空。因此,为了执行代码,您必须断言NOTNULL。但请确保cameraDevice在此处从不为空。 因此,使用下面的代码
@Override
public void onOpened(CameraDevice camera) {
//This is called when the camera is open
cameraDevice!! = camera;
randomFunction();
}
在代码中的任何地方使用此选项。cameraDevice可以随时为空。因此,为了执行代码,您必须断言NOTNULL。但请确保cameraDevice在此处从不为空。 因此,使用下面的代码
@Override
public void onOpened(CameraDevice camera) {
//This is called when the camera is open
cameraDevice!! = camera;
randomFunction();
}
在代码中的任何地方都使用此选项。执行此操作时
val cameraDevice:CameraDevice?;
val
变量需要初始初始化
表示您在声明时有赋值
在变量的初始化之后
,您不能更改它的值
如果您想延迟初始化,那么可以这样做
var cameraDevice:CameraDevice?=null // you have to assign the null at initial
或者您可以像这样使用lateinit
lateinit var cameraDevice:CameraDevice //this does not required initialization at initial level
当你这样做的时候
val cameraDevice:CameraDevice?;
val
变量需要初始初始化
表示您在声明时有赋值
在变量的初始化之后
,您不能更改它的值
如果您想延迟初始化,那么可以这样做
var cameraDevice:CameraDevice?=null // you have to assign the null at initial
或者您可以像这样使用lateinit
lateinit var cameraDevice:CameraDevice //this does not required initialization at initial level
对于
cameraDevice
,您应该像这样使用lateinit
:
lateinit var cameraDevice: CameraDevice
如果遇到onError
,请检查cameraDevice
是否已初始化,然后才调用close()
它以避免出现UninitializedPropertyAccessException
@Override
public void onError(CameraDevice camera, int error) {
if(::cameraDevice.isInitialized) {
cameraDevice.close();
}
}
对于
cameraDevice
,您应该像这样使用lateinit
:
lateinit var cameraDevice: CameraDevice
如果遇到onError
,请检查cameraDevice
是否已初始化,然后才调用close()
它以避免出现UninitializedPropertyAccessException
@Override
public void onError(CameraDevice camera, int error) {
if(::cameraDevice.isInitialized) {
cameraDevice.close();
}
}
使用
var-cameraDevice:cameraDevice?=空
并像使用cameraDevice?.close()一样使用它。如果使用val,则不能像cameraDevice=camera
那样重新分配它。您能解释一下为什么不将其声明为var
?使用var cameraDevice:cameraDevice?=空
并像使用cameraDevice?.close()一样使用它。如果您使用val,则不能像cameraDevice=camera
那样重新分配它。您能解释一下为什么不将其声明为var
?这并不能真正告诉OP如何在声明它的位置初始化它您缺少val cameraDevice:cameraDevice?=null
这并没有告诉OP如何在声明它的地方初始化它您缺少val-cameraDevice:cameraDevice?=null
我也想到了lateinit
,但只有在onOpened
中初始化变量时,这才有效。如果它只进入onError
,它就会崩溃。我也想到了lateinit
,但这只有在onOpened
中初始化变量时才起作用。如果它只进入onError
,它将崩溃。