在Android Studio中使用导航框架时,如何知道保留的类名或关键字?

Hel*_*oCW 4 kotlin android-studio

以下代码来自https://github.com/mycwcgr/camera/tree/master/CameraXBasic中的项目

该项目使用最新的导航框架,我发现有一些保留的类名,例如CameraFragmentDirectionsGalleryFragmentArgs

系统没有有关这些类名称的提示信息,我是否必须自己记住这些关键字?

 /** Method used to re-draw the camera UI controls, called every time configuration changes */
    @SuppressLint("RestrictedApi")
    private fun updateCameraUi() {

        // Listener for button used to view last photo
        controls.findViewById<ImageButton>(R.id.photo_view_button).setOnClickListener {
            Navigation.findNavController(requireActivity(), R.id.fragment_container).navigate(
                    CameraFragmentDirections.actionCameraToGallery(outputDirectory.absolutePath))
        }
    }


   /** Fragment used to present the user with a gallery of photos taken */
   class GalleryFragment internal constructor() : Fragment() {

       /** AndroidX navigation arguments */
       private val args: GalleryFragmentArgs by navArgs()

   }
Run Code Online (Sandbox Code Playgroud)

Ens*_*lic 5

不,如果您知道一个窍门,则无需自己记住这些事情。

例如,如果您不记得“ keyword” Directions,但是您知道要执行与相关的操作CameraFragment,则可以CameraFragm在Android Studio中开始输入。然后,它会建议CameraFragment,并CameraFragmentDirections为您服务。这样,CameraFragmentDirections即使您不记得关键字,也可以轻松找到Directions

虽然没有太多的关键字要担心。在使用导航框架一段时间后,您将记住所有这些内容。

如果您好奇,可以在构建后在此处找到生成的类:

./app/build/generated/source/navigation-args/...
Run Code Online (Sandbox Code Playgroud)

例如在调试构建后:

./app/build/generated/source/navigation-args/debug/com/android/example/cameraxbasic/fragments/CameraFragmentDirections.java
Run Code Online (Sandbox Code Playgroud)

如果您更好奇,可以在这里生成这些类的代码:https : //android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/navigation/navigation-safe- args-generator / src / main / kotlin / androidx / navigation / safe / args / generator / java / JavaNavWriter.kt

例如,您可以在其中找到以下代码:

internal fun Destination.toClassName(): ClassName {
    val destName = name ?: throw IllegalStateException("Destination with actions must have name")
    return ClassName.get(destName.packageName(), "${destName.simpleName()}Directions")
}
Run Code Online (Sandbox Code Playgroud)

这是决定CameraFragmentDirections获得什么名字的代码。(最后请注意"${destName.simpleName()}Directions"。)