如何使用 url 在我的应用程序而不是外部应用程序中加载或显示 pdf,我想使用这个官方 androidx 库,任何人都可以指导我使用 jetpack compose
https://developer.android.com/jetpack/androidx/releases/pdf#1.0.0-alpha01
应用程序级别builde.gradle
dependencies {
implementation("androidx.pdfviewer:pdfviewer:1.0.0-alpha04")
}
PDFViewer 可组合
未解决的参考 PDFView
@Composable
fun PdfViewer(uri: Uri) {
AndroidView(
factory = { context ->
PDFView(context).apply {
fromUri(uri).defaultPage(0) // Set default page to 0
this.load() // Call load() on the PDFView instance
}
},
modifier = Modifier.fillMaxSize()
)
}
androidx.pdfviewer:pdfviewer
不提供任何您可以使用的View
。相反,它提供了您应该使用的 PdfViewerFragment
。
要使用
PdfViewerFragment
并在 Compose 中显示它,您将需要以下依赖项:
implementation("androidx.pdf:pdf-viewer-fragment:1.0.0-alpha04")
implementation("androidx.fragment:fragment-compose:1.8.5")
接下来,您的
style
中定义的应用程序 theme.xml
必须扩展任何 Material3
主题:
<style name="Theme.ComposePlayground" parent="Theme.Material3.Light.NoActionBar" />
最后,您可以使用
AndroidFragment
可组合项来显示 PdfViewerFragment
:
@Composable
fun PdfViewer(modifier: Modifier = Modifier, uri: Uri) {
AndroidFragment<PdfViewerFragment>(
arguments = bundleOf("documentUri" to uri),
modifier = modifier
)
}
PdfViewerFragment
从片段Uri
捆绑中获取arguments
。请注意,目前只有 Uri
以 开头
content://
file://
支持,因此无法打开在线PDF。
示例:
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DocumentViewer() {
var documentUri by remember { mutableStateOf<Uri?>(null) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) {
documentUri = it
}
Column(
horizontalAlignment = Alignment.CenterHorizontally
) {
CenterAlignedTopAppBar(
title = { Text("Document Viewer") }
)
FilledTonalButton(
onClick = {
launcher.launch(arrayOf("application/pdf"))
}
) {
Text(text = "Select Document")
}
documentUri?.let {
PdfViewer(
modifier = Modifier.weight(1f).fillMaxWidth(),
uri = it
)
}
}
}
输出:
注:
PdfViewerFragment
仍处于早期开发阶段,可能存在错误。此外,可以使用它的 API 级别也有很多限制。我在 API35
上测试了它,但如果您想将其与较旧的 minSdk
一起使用,您可能需要使用 SDK Extensions。 linter 会告诉您是否需要使用它。