From ec22152e37d7f650e0e7c753400737a624a193fe Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 19 Aug 2024 17:53:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/main/MainActivity.kt | 14 ++++++++++++-- .../bookshelf/style1/BookshelfFragment1.kt | 14 ++++++++++++-- .../legado/app/ui/widget/dialog/TextDialog.kt | 18 +++++++++++------- .../io/legado/app/utils/FragmentExtensions.kt | 6 +++++- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 641c1dffd..57e6bfa56 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -43,11 +43,17 @@ import io.legado.app.ui.main.explore.ExploreFragment import io.legado.app.ui.main.my.MyFragment import io.legado.app.ui.main.rss.RssFragment import io.legado.app.ui.widget.dialog.TextDialog -import io.legado.app.utils.* +import io.legado.app.utils.hideSoftInput +import io.legado.app.utils.isCreated +import io.legado.app.utils.observeEvent +import io.legado.app.utils.setEdgeEffectColor +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import kotlin.collections.set import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -446,7 +452,11 @@ class MainActivity : VMBaseActivity(), } override fun instantiateItem(container: ViewGroup, position: Int): Any { - val fragment = super.instantiateItem(container, position) as Fragment + var fragment = super.instantiateItem(container, position) as Fragment + if (fragment.isCreated && getItemPosition(fragment) == POSITION_NONE) { + destroyItem(container, position, fragment) + fragment = super.instantiateItem(container, position) as Fragment + } fragmentMap[getId(position)] = fragment return fragment } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt index 432df984c..dfc83112c 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt @@ -22,7 +22,10 @@ import io.legado.app.ui.book.group.GroupEditDialog import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.main.bookshelf.BaseBookshelfFragment import io.legado.app.ui.main.bookshelf.style1.books.BooksFragment -import io.legado.app.utils.* +import io.legado.app.utils.isCreated +import io.legado.app.utils.setEdgeEffectColor +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlin.collections.set @@ -168,8 +171,15 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) } override fun instantiateItem(container: ViewGroup, position: Int): Any { - val fragment = super.instantiateItem(container, position) as BooksFragment + var fragment = super.instantiateItem(container, position) as BooksFragment val group = bookGroups[position] + /** + * Activity recreate 会复用之前的 Fragment,不正确的需要需要重新创建 + */ + if (fragment.isCreated && getItemPosition(fragment) == POSITION_NONE) { + destroyItem(container, position, fragment) + fragment = super.instantiateItem(container, position) as BooksFragment + } fragmentMap[group.groupId] = fragment return fragment } diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt index fd837b15f..bdd3e6f84 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt @@ -17,8 +17,10 @@ import io.noties.markwon.Markwon import io.noties.markwon.ext.tables.TablePlugin import io.noties.markwon.html.HtmlPlugin import io.noties.markwon.image.glide.GlideImagesPlugin +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class TextDialog() : BaseDialogFragment(R.layout.dialog_text_view) { @@ -67,13 +69,15 @@ class TextDialog() : BaseDialogFragment(R.layout.dialog_text_view) { binding.toolBar.title = it.getString("title") val content = IntentData.get(it.getString("content")) ?: "" when (it.getString("mode")) { - Mode.MD.name -> binding.textView.post { - Markwon.builder(requireContext()) - .usePlugin(GlideImagesPlugin.create(requireContext())) - .usePlugin(HtmlPlugin.create()) - .usePlugin(TablePlugin.create(requireContext())) - .build() - .setMarkdown(binding.textView, content) + Mode.MD.name -> viewLifecycleOwner.lifecycleScope.launch { + binding.textView.text = withContext(IO) { + Markwon.builder(requireContext()) + .usePlugin(GlideImagesPlugin.create(requireContext())) + .usePlugin(HtmlPlugin.create()) + .usePlugin(TablePlugin.create(requireContext())) + .build() + .toMarkdown(content) + } } Mode.HTML.name -> binding.textView.setHtml(content) diff --git a/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt b/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt index ed76e3469..432d0690f 100644 --- a/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt @@ -12,6 +12,7 @@ import androidx.annotation.DrawableRes import androidx.core.content.edit import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import io.legado.app.R import io.legado.app.ui.widget.dialog.TextDialog @@ -83,4 +84,7 @@ inline fun Fragment.startActivity( fun Fragment.showHelp(fileName: String) { val mdText = String(requireContext().assets.open("web/help/md/${fileName}.md").readBytes()) showDialogFragment(TextDialog(getString(R.string.help), mdText, TextDialog.Mode.MD)) -} \ No newline at end of file +} + +val Fragment.isCreated + get() = lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)