Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在Kotlin类中声明公共值(val),以便稍后对其进行初始化。在这种特殊情况下不能使用var_Android_Variables_Kotlin_Android Camera_Android Camera2 - Fatal编程技术网

Android 如何在Kotlin类中声明公共值(val),以便稍后对其进行初始化。在这种特殊情况下不能使用var

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

我正在尝试使用Kotlin在Android上制作一个简单的摄像头应用程序。我无法将一些java代码转换为Kotlin。 我如何在Kotlin申报cameraDevice

Java代码:

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
,它将崩溃。