Creación de un visor de PDF para Android: 7. Implementación de apertura de múltiples instancias y árbol de directorios de documentos
Cualquier espectador, independientemente de la plataforma, debe admitir el modo multiinstancia. No solo debemos admitir el modo de instancias múltiples, sino que también podemos cambiar al modo de instancia única. En instancias múltiples, cuando abrimos repetidamente el mismo archivo en una aplicación externa, podemos saltar a la instancia existente sin abrir el mismo repetidamente. archivo. Ejemplo, este es el diseño.
Para hacer esto, necesitas hacer un uso intensivo de variables globales estáticas. No tiene que preocuparse por las pérdidas de memoria; siempre que no falle, puede liberar la referencia en onDestroy. Si falla, todo el proceso virtual se detiene, entonces, ¿de qué hay que preocuparse?
Hay dos opciones para abrir la interfaz de usuario principal desde el escritorio:
Interfaz de usuario principal
Barra inferior: Adelante, Atrás, Buscar, Esquema de marcador, Más actualizaciones de Miyazaki
Más de Miyazaki 2.ª barra inferior (arriba de la barra inferior)
Miyazaki: modo nocturno, historial, marcadores, configuración, modo de miniaturas, rotación de pantalla, lectura en voz alta, página de salto, barra de progreso, miniatura pequeña, miniatura pequeña a la izquierda. Miniaturas, miniaturas pequeñas a la izquierda, notas pequeñas a la derecha
Barra inferior: Sal del programa, sal del programa y vuelve atrás, vuelve atrás
Tómate tu tiempo con estas, es suficiente para que lo haga durante un año. Eso es todo...
Hablemos primero de la barra inferior, luego personalicemos la barra inferior y, finalmente, del palacio y su animación de transformación.
Burning Goose solo tiene un tiempo limitado, así que tal vez elimine la animación, elimine la personalización y hágalo rápidamente...
Optimizar TellH/RecyclerTreeView:
De hecho, se puede lograr un efecto similar con una vista de lista (ver más abajo), pero dado que alguien (parece ser el equipo de Jitterbug Android) abstrajo la biblioteca específicamente, no hay necesidad de reinventar la rueda, solo mejorarla. No es necesario crear un nuevo módulo de biblioteca para unos dos o tres archivos, simplemente ingrese el código fuente directamente, lo cual es simple y sin problemas.
Cuadro de diálogo de tabla de contenido: visor, marcadores uno al lado del otro, tabla de contenido, lista de comentarios
Cuadro de diálogo + visor + FragmentPagerAdapter + los tres fragmentos anteriores
Preste atención a la estructura de los parámetros de la función FragmentPagerAdapter. Debe pasar getChildFragmentManager() en lugar de getSupportFragmentManager(); de lo contrario, dado que se trata de un fragmento de diálogo anidado, pasar el FragmentManager global provocará que la aplicación se bloquee (no se encontró la vista de ID). ... para fragmento ... excepción).
Dado que hemos decidido usar Dialog, también podemos usar DialogFragment directamente. Su configuración es más flexible. Puede mostrar un cuadro de diálogo como un cuadro de diálogo, o puede optar por usarlo como uno normal. Fragmentarlo y cargarlo directamente en el diseño de la interfaz principal.
El diseño de la interfaz de diálogo se divide en tres capas:
Barra de herramientas, varios botones pequeños
Marcadores del visor, directorio, lista de comentarios
Marcador TabLayout , tabla de contenido, lista de anotaciones
Al extraer la tabla de contenido de un PDF, debe utilizar las siguientes API: FPDFBookmark_GetFirstChild, FPDFBookmark_GetFirstChild, FPDFBookmark_GetFirstChild, FPDFBookmark_GetFirstChild, FPDFBookmark_GetFirstChild.
De hecho, FPDFBookmark_GetFirstChild , FPDFBookmark_GetNextSibling, FPDFBookmark_GetTitle, FPDFBookmark_GetDest no tiene función de edición.
De hecho, además de contener números de página, el directorio de marcadores de PDF también puede contener algunos parámetros de visualización, como zoom, posición de página, etc. Dado que PDFium no admite la edición de marcadores, eso es todo por ahora.
Registre la reutilización de esta ventana de diálogo del árbol de directorios activada por recyclerview que no responde al error de llamada notifydatasetchanged (se resolvió el error por el cual el visor anidado de fragmentos y luego el recyclerview anidado causaba que recyclerview no se actualizara normalmente). .
Después de descartarlo y reutilizarlo, cuando hace clic en un directorio de la lista, el directorio ya no se expande y al reciclar la vista no se actualiza la vista. Sin embargo, desplazarse un poco recicla la vista (incluso si hay muy pocas entradas para desplazarse, deslizar hacia arriba será suficiente). Esto demuestra que no hay ningún problema con el procesamiento lógico. Entonces, ¿cuál es el problema?
La respuesta es que el adaptador del visor no se puede reutilizar. La clave es que al adaptador se le pasa un objeto getChildFragmentManager(). El objeto dejará de ser válido inmediatamente después de que se cierre el cuadro de diálogo. Entonces, incluso si la vista se reutiliza, el segundo onCreateView necesita restablecer el adaptador del visor.