gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 16:28:09 27 4
gpt4 key购买 nike

代码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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com