Преглед на файлове

修复编辑内容失效的问题

HapeLee преди 1 година
родител
ревизия
82c2f187a5
променени са 2 файла, в които са добавени 65 реда и са изтрити 24 реда
  1. 45 15
      app/src/main/java/io/legato/kazusa/ui/book/read/ContentEditDialog.kt
  2. 20 9
      app/src/main/res/layout/dialog_content_edit.xml

+ 45 - 15
app/src/main/java/io/legato/kazusa/ui/book/read/ContentEditDialog.kt

@@ -1,16 +1,17 @@
 package io.legato.kazusa.ui.book.read
 package io.legato.kazusa.ui.book.read
 
 
-//import io.legado.app.lib.theme.primaryColor
 import android.app.Application
 import android.app.Application
 import android.content.DialogInterface
 import android.content.DialogInterface
 import android.os.Bundle
 import android.os.Bundle
+import android.text.Spannable
+import android.text.Spanned
+import android.text.style.BackgroundColorSpan
 import android.view.View
 import android.view.View
-import android.view.ViewGroup
 import androidx.fragment.app.viewModels
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.lifecycleScope
 import io.legato.kazusa.R
 import io.legato.kazusa.R
-import io.legato.kazusa.base.BaseDialogFragment
+import io.legato.kazusa.base.BaseBottomSheetDialogFragment
 import io.legato.kazusa.base.BaseViewModel
 import io.legato.kazusa.base.BaseViewModel
 import io.legato.kazusa.data.appDb
 import io.legato.kazusa.data.appDb
 import io.legato.kazusa.data.entities.BookChapter
 import io.legato.kazusa.data.entities.BookChapter
@@ -25,7 +26,7 @@ import io.legato.kazusa.model.ReadBook
 import io.legato.kazusa.model.webBook.WebBook
 import io.legato.kazusa.model.webBook.WebBook
 import io.legato.kazusa.utils.gone
 import io.legato.kazusa.utils.gone
 import io.legato.kazusa.utils.sendToClip
 import io.legato.kazusa.utils.sendToClip
-import io.legato.kazusa.utils.setLayout
+import io.legato.kazusa.utils.themeColor
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
 import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
 import io.legato.kazusa.utils.visible
 import io.legato.kazusa.utils.visible
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
@@ -35,16 +36,11 @@ import kotlinx.coroutines.withContext
 /**
 /**
  * 内容编辑
  * 内容编辑
  */
  */
-class ContentEditDialog : BaseDialogFragment(R.layout.dialog_content_edit) {
+class ContentEditDialog : BaseBottomSheetDialogFragment(R.layout.dialog_content_edit) {
 
 
     val binding by viewBinding(DialogContentEditBinding::bind)
     val binding by viewBinding(DialogContentEditBinding::bind)
     val viewModel by viewModels<ContentEditViewModel>()
     val viewModel by viewModels<ContentEditViewModel>()
 
 
-    override fun onStart() {
-        super.onStart()
-        setLayout(1f, ViewGroup.LayoutParams.MATCH_PARENT)
-    }
-
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
         //binding.toolBar.setBackgroundColor(primaryColor)
         //binding.toolBar.setBackgroundColor(primaryColor)
         binding.toolBar.title = ReadBook.curTextChapter?.title
         binding.toolBar.title = ReadBook.curTextChapter?.title
@@ -68,13 +64,18 @@ class ContentEditDialog : BaseDialogFragment(R.layout.dialog_content_edit) {
         viewModel.initContent {
         viewModel.initContent {
             binding.contentView.setText(it)
             binding.contentView.setText(it)
             binding.contentView.post {
             binding.contentView.post {
-                binding.contentView.apply {
-                    val lineIndex = layout.getLineForOffset(ReadBook.durChapterPos)
-                    val lineHeight = layout.getLineTop(lineIndex)
-                    scrollTo(0, lineHeight)
-                }
+                val layout = binding.contentView.layout ?: return@post
+                val targetY = binding.contentView.top +
+                        layout.getLineTop(
+                            layout.getLineForOffset(ReadBook.durChapterPos)
+                        )
+
+                binding.scrollView.smoothScrollTo(0, targetY)
+
+                highlightCurrentLineTwice()
             }
             }
         }
         }
+
     }
     }
 
 
     private fun initMenu() {
     private fun initMenu() {
@@ -116,6 +117,35 @@ class ContentEditDialog : BaseDialogFragment(R.layout.dialog_content_edit) {
         }
         }
     }
     }
 
 
+    private fun highlightCurrentLineTwice() {
+        val editText = binding.contentView
+        val layout = editText.layout ?: return
+        val offset = ReadBook.durChapterPos
+        val lineIndex = layout.getLineForOffset(offset)
+
+        val start = layout.getLineStart(lineIndex)
+        val end = layout.getLineEnd(lineIndex)
+
+        val spannable = editText.text as Spannable
+        val span =
+            BackgroundColorSpan(requireContext().themeColor(com.google.android.material.R.attr.colorSecondaryContainer))
+
+
+        fun flash(times: Int) {
+            if (times <= 0) return
+            spannable.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+            editText.postDelayed({
+                spannable.removeSpan(span)
+                editText.postDelayed({
+                    flash(times - 1)
+                }, 200)
+            }, 300)
+        }
+
+        flash(3)
+    }
+
+
     override fun onCancel(dialog: DialogInterface) {
     override fun onCancel(dialog: DialogInterface) {
         super.onCancel(dialog)
         super.onCancel(dialog)
         save()
         save()

+ 20 - 9
app/src/main/res/layout/dialog_content_edit.xml

@@ -2,7 +2,7 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
+    android:layout_height="wrap_content"
     android:orientation="vertical">
     android:orientation="vertical">
 
 
     <androidx.appcompat.widget.Toolbar
     <androidx.appcompat.widget.Toolbar
@@ -11,17 +11,28 @@
         android:layout_height="wrap_content"
         android:layout_height="wrap_content"
         android:theme="?attr/actionBarStyle"
         android:theme="?attr/actionBarStyle"
         app:title="edit"
         app:title="edit"
-
         app:layout_constraintTop_toTopOf="parent" />
         app:layout_constraintTop_toTopOf="parent" />
 
 
-    <io.legato.kazusa.lib.theme.view.ThemeEditText
-        android:id="@+id/content_view"
+    <androidx.core.widget.NestedScrollView
+        android:id="@+id/scrollView"
         android:layout_width="match_parent"
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:padding="12dp"
-        android:importantForAutofill="no"
-        app:layout_constraintTop_toBottomOf="@+id/tool_bar"
-        app:layout_constraintBottom_toBottomOf="parent" />
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toBottomOf="@id/tool_bar">
+
+        <io.legato.kazusa.ui.widget.text.TextInputLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp"
+            app:layout_constraintTop_toBottomOf="@+id/tool_bar">
+            <com.google.android.material.textfield.TextInputEditText
+                android:id="@+id/content_view"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:importantForAutofill="no"
+                />
+        </io.legato.kazusa.ui.widget.text.TextInputLayout>
+
+    </androidx.core.widget.NestedScrollView>
 
 
     <com.google.android.material.loadingindicator.LoadingIndicator
     <com.google.android.material.loadingindicator.LoadingIndicator
         android:id="@+id/rl_loading"
         android:id="@+id/rl_loading"