android - 为什么 camerax 示例项目不将常量放入类中?

标签 android kotlin

代码A来自camerax sample项目。

PERMISSIONS_REQUEST_CODE 是一个常量,我觉得应该放在一个类里面,就像代码B一样。

我觉得Code B可以减少偶数,更清晰

代码 A 是否比代码 B 更好?

代码A

private const val PERMISSIONS_REQUEST_CODE = 10
private val PERMISSIONS_REQUIRED = arrayOf(Manifest.permission.CAMERA)

class PermissionsFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (!hasPermissions(requireContext())) {
            // Request camera-related permissions
            requestPermissions(PERMISSIONS_REQUIRED, PERMISSIONS_REQUEST_CODE)
        } else {
            // If permissions have already been granted, proceed
            Navigation.findNavController(requireActivity(), R.id.fragment_container).navigate(
                    PermissionsFragmentDirections.actionPermissionsToCamera())
        }
    }

    override fun onRequestPermissionsResult(
            requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == PERMISSIONS_REQUEST_CODE) {
            if (PackageManager.PERMISSION_GRANTED == grantResults.firstOrNull()) {
                // Take the user to the success fragment when permission is granted
                Toast.makeText(context, "Permission request granted", Toast.LENGTH_LONG).show()
                Navigation.findNavController(requireActivity(), R.id.fragment_container).navigate(
                        PermissionsFragmentDirections.actionPermissionsToCamera())
            } else {
                Toast.makeText(context, "Permission request denied", Toast.LENGTH_LONG).show()
            }
        }
    }

   ...
}

代码B

private val PERMISSIONS_REQUIRED = arrayOf(Manifest.permission.CAMERA)

class PermissionsFragment : Fragment() {

    private val PERMISSIONS_REQUEST_CODE = 10

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (!hasPermissions(requireContext())) {
            // Request camera-related permissions
            requestPermissions(PERMISSIONS_REQUIRED, PERMISSIONS_REQUEST_CODE)
        } else {
            // If permissions have already been granted, proceed
            Navigation.findNavController(requireActivity(), R.id.fragment_container).navigate(
                    PermissionsFragmentDirections.actionPermissionsToCamera())
        }
    }

    override fun onRequestPermissionsResult(
            requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == PERMISSIONS_REQUEST_CODE) {
            if (PackageManager.PERMISSION_GRANTED == grantResults.firstOrNull()) {
                // Take the user to the success fragment when permission is granted
                Toast.makeText(context, "Permission request granted", Toast.LENGTH_LONG).show()
                Navigation.findNavController(requireActivity(), R.id.fragment_container).navigate(
                        PermissionsFragmentDirections.actionPermissionsToCamera())
            } else {
                Toast.makeText(context, "Permission request denied", Toast.LENGTH_LONG).show()
            }
        }
    }

   ...
}

最佳答案

通过添加请求代码作为compile-time constant ,它可以在不保留类实例的情况下访问(如 Java 中的 static 修饰符)。

Properties the value of which is known at compile time can be marked as compile time constants using the const modifier. Such properties need to fulfil the following requirements:

Top-level, or member of an object declaration or a companion object.
Initialized with a value of type String or a primitive type
No custom getter
Such properties can be used in annotations

代码示例制作了一个单独负责处理相机权限的 fragment 。虽然 onActivityResult() 是在 fragment 内部处理的,但稍后您可能会想根据结果在父 Activity 中做一些工作,例如删除这个请求完成时的 fragment 。为此,您需要在 Activity 中访问此请求代码。通过将请求代码添加为 compile-time constant , 它可以在不保留 fragment 实例的情况下访问。

除此之外,这两种方法都没有优点/缺点,因为您无论如何都只会在整个应用程序中创建此 fragment 的一个实例。

关于android - 为什么 camerax 示例项目不将常量放入类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58798419/

相关文章:

android - 如果这是主线程崩溃,如何从 UncaughtExceptionHandler 启动 Activity ?

android - 从两倍小的 ImageView 中获取位图图像的坐标

Android - For 循环中的 R.array.[variable]?

java - 有多个好的构造函数,Room 会选择无参数构造函数

android - 如何使用导航组件处理 fragment 内的向上按钮

java - Kotlin:如果条件为真,则将变量转换为不可空

Kotlin 类型推断失败

android - 在 OSX 上使用 Make 为 Android 编译

java - 我正在尝试构建我的应用程序,但收到此错误 : AAPT2 process unexpectedly exit. 错误输出

android-studio - 用于使用 gradle (1.1.2-5) 构建的 kotlin 版本与捆绑到 IDE 插件 (1.1.2-4) 中的版本不同