我想在自定义对话框中显示 PDF。我从服务中获取 PDF 作为 ByteArray。我将 ByteArray 传递给 PDFView 对象,然后使 Dialog 膨胀。除了 pdfview 之外,对话框中的所有视图都是可见的。
这是我的活动代码:
val fileName = "filename.pdf"
val dialog = Dialog(this)
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialog.setCancelable(true)
dialog.setContentView(R.layout.activity_pdf_view)
val pdfView = dialog.findViewById(R.id.pdfView) as PDFView
val closeBtn = dialog.findViewById(R.id.closeBtn) as ImageButton
val downloadBtn = dialog.findViewById(R.id.downloadBtn) as Button
pdfView.fromBytes(byteArray).load()
dialog.show()
下面是 xml activity_pdf_view.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ticketLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@drawable/bg_ticket_layout">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="Ticket"
android:textSize="15sp"
android:textColor="@color/black"
android:layout_margin="25dp"/>
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="39dp"
android:layout_marginBottom="8dp"
android:layout_marginHorizontal="8dp"/>
<ImageButton
android:id="@+id/closeBtn"
android:layout_width="11dp"
android:layout_height="11dp"
android:background="@color/white"
android:contentDescription="@string/close"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_cancel_icon"
android:layout_marginTop="20dp"
android:layout_marginEnd="24dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<Button
android:id="@+id/downloadBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/submit_btn_bg"
android:drawableStart="@drawable/ic_file_download_white"
android:text="@string/download_pdf"
android:textColor="@color/white"
android:textSize="15sp"
app:layout_constraintEnd_toEndOf="@id/ticketLayout"
app:layout_constraintStart_toStartOf="@id/ticketLayout"
app:layout_constraintTop_toBottomOf="@id/ticketLayout"
android:paddingHorizontal="19dp"
android:drawablePadding="10dp"
android:layout_marginTop="15dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
这是视图的外观:
我调试了代码并确认 byteArray 不为空。所有其他视图(如关闭按钮和下载按钮)都按预期正常运行。只有 pdfview 不显示任何内容。
我首先尝试了很多东西,比如 AlertDialog.Builder,一个带有 Dialog 主题的活动和更多方法,最后将代码分解为最简单的方法。看法还是没有变化。
请帮我在这里找出问题。提前非常感谢:)
更新:
问题是,如果我将 wrap_content 用于父 ConstraintLayout,它会显示这个小视图,如屏幕截图所示。但是当我使用 match_parent 时,它会正确显示 PDFView(但会在整个屏幕上拉伸,虽然看起来很难看)。所以我所做的是硬编码父约束布局的高度。我在互联网上进行了一些挖掘,发现当父 ConstraintLayout 绘制其子布局时,PDFView 内的 PDF 未加载。那么有没有人知道在加载所有数据后我可以重绘布局的任何方式?