Horis il y a 2 ans
Parent
commit
906adec833

+ 12 - 2
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<ActivityMainBinding, MainViewModel>(),
         }
 
         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
         }

+ 12 - 2
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
         }

+ 11 - 7
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)

+ 5 - 1
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 <reified T : Activity> 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))
-}
+}
+
+val Fragment.isCreated
+    get() = lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)