【问题标题】:How can I reach a function defined in fragment from different class in Android?如何从 Android 的不同类中访问片段中定义的函数?
【发布时间】:2020-12-16 07:32:19
【问题描述】:

我有一个应用程序,它有一个片段,旨在显示通过单击按钮选择的 pdf。我已经实现了这个方法,但是如何在应该调用这个方法的不同类中调用这个片段函数?

这个方法在我尝试到达片段函数的类中定义:

fun importPdf(fragment: Fragment, label: DocumentLabel?) {
   val pickPdfDocument =
   fragment.registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
    if (uri == null) {
     KycEventBus.post(DocumentImportEvent(false))
    }
    uri?.let {
     Log.d(TAG, "ImportPdf - ActivityResultContracts.GetContent() successful.")

     PdfViewer.displayFromUri(it) // Here is where I try to reach

     val documentPdfFile = DocumentUtil.saveUriAsTemporary(
     context = fragment.requireContext(),
     uri = uri,
     subFolder = cacheFolderName + File.separator + cachePdfFolderName,
     label = label?.name,
     documentType = DocumentUtil.DocumentType.PDF
    )

    documentPhotoFilePath = documentPdfFile.path
    Log.d(TAG, "documentPhotoFile path: " + documentPdfFile.path)
    KycEventBus.post(DocumentImportEvent(true))
          }
       }
    pickPdfDocument.launch("application/pdf")
 }

这个函数在片段中:

public fun displayFromUri(uri: Uri) {
        pdfFilePath = getFileName(uri)
        pdfView_fragment_pdfviewer!!.fromUri(uri)
            .defaultPage(pageNumber)
            .onPageChange(this)
            .enableAnnotationRendering(true)
            .onLoad(this)
            .scrollHandle(DefaultScrollHandle(context))
            .spacing(10) // in dp
            .onPageError(this)
            .load()
}

【问题讨论】:

    标签: android pdf android-fragments fragment


    【解决方案1】:

    如果您希望它更灵活,请考虑使用实时数据、rxJava 或协程 API,如下所示:

    private val _importResult = MutableLiveData<Uri>()
    val importResult: LiveData<Uri> = _importResult
    fun importPdf(fragment: Fragment, label: DocumentLabel?): LiveData<Uri> {
      ....
      _importResult.value = uri
    }
    

    然后在您希望从中调用方法的片段中观察此实时数据:

    classToCallFragmentMethodFromInstance.importResult.observe(viewLifecycleObserver, Observer{
      // call your method here
    })
    

    使用这种方法,您可以将您希望从片段调用方法的类中的代码与实际片段解耦,因此多个片段可以使用此类。

    【讨论】:

      【解决方案2】:

      创建这个类的实例并调用函数。

      【讨论】:

        【解决方案3】:

        companion object

        中添加fragment的方法
        companion object{
        
           fun displayFromUri(uri: Uri) {
                pdfFilePath = getFileName(uri)
                pdfView_fragment_pdfviewer!!.fromUri(uri)
                    .defaultPage(pageNumber)
                    .onPageChange(this)
                    .enableAnnotationRendering(true)
                    .onLoad(this)
                    .scrollHandle(DefaultScrollHandle(context))
                    .spacing(10) // in dp
                    .onPageError(this)
                    .load()
        }
        
        }
        

        然后在类中调用它:

        displayFromUri(Uri.parse("url"))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-26
          • 1970-01-01
          • 2020-07-13
          • 1970-01-01
          • 2020-10-30
          • 1970-01-01
          相关资源
          最近更新 更多