更新界面

This commit is contained in:
HapeLee
2025-07-06 03:03:11 +08:00
parent a07935f466
commit c3bc0ae2c1
15 changed files with 282 additions and 263 deletions
@@ -2,11 +2,13 @@ package io.legato.kazusa.base
import android.content.DialogInterface import android.content.DialogInterface
import android.content.DialogInterface.OnDismissListener import android.content.DialogInterface.OnDismissListener
import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.annotation.LayoutRes import androidx.annotation.LayoutRes
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import io.legato.kazusa.constant.AppLog import io.legato.kazusa.constant.AppLog
import io.legato.kazusa.help.coroutine.Coroutine import io.legato.kazusa.help.coroutine.Coroutine
@@ -24,11 +26,14 @@ abstract class BaseBottomSheetDialogFragment(
this.onDismissListener = onDismissListener this.onDismissListener = onDismissListener
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onStart() {
super.onCreate(savedInstanceState) super.onStart()
// if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N) { if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// setStyle(STYLE_NO_TITLE, 0) val screenHeight = resources.displayMetrics.heightPixels
// } (dialog as? BottomSheetDialog)?.behavior?.apply {
peekHeight = (screenHeight * 0.7f).toInt()
}
}
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -35,8 +35,8 @@ import io.legato.kazusa.lib.dialogs.alert
import io.legato.kazusa.service.BaseReadAloudService import io.legato.kazusa.service.BaseReadAloudService
import io.legato.kazusa.ui.about.CrashLogsDialog import io.legato.kazusa.ui.about.CrashLogsDialog
import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment
import io.legato.kazusa.ui.main.bookshelf.style1.BookshelfFragment1 import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment1
import io.legato.kazusa.ui.main.bookshelf.style2.BookshelfFragment2 import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment2
import io.legato.kazusa.ui.main.explore.ExploreFragment import io.legato.kazusa.ui.main.explore.ExploreFragment
import io.legato.kazusa.ui.main.my.MyFragment import io.legato.kazusa.ui.main.my.MyFragment
import io.legato.kazusa.ui.main.rss.RssFragment import io.legato.kazusa.ui.main.rss.RssFragment
@@ -55,7 +55,7 @@ import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
import androidx.core.view.get import androidx.core.view.get
import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationBarView
import io.legato.kazusa.ui.main.bookshelf.style1.BookshelfFragment3 import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment3
/** /**
* 主界面 * 主界面
@@ -92,7 +92,6 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// 绑定返回键逻辑
onBackPressedDispatcher.addCallback(this) { onBackPressedDispatcher.addCallback(this) {
if (pagePosition != 0) { if (pagePosition != 0) {
binding.viewPagerMain.currentItem = 0 binding.viewPagerMain.currentItem = 0
@@ -1,7 +1,6 @@
package io.legato.kazusa.ui.main.bookshelf.style1.books package io.legato.kazusa.ui.main.bookshelf.books
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.ViewConfiguration import android.view.ViewConfiguration
@@ -28,6 +27,9 @@ import io.legato.kazusa.help.config.AppConfig
//import io.legado.app.lib.theme.primaryColor //import io.legado.app.lib.theme.primaryColor
import io.legato.kazusa.ui.book.info.BookInfoActivity import io.legato.kazusa.ui.book.info.BookInfoActivity
import io.legato.kazusa.ui.main.MainViewModel import io.legato.kazusa.ui.main.MainViewModel
import io.legato.kazusa.ui.main.bookshelf.books.styleDefalut.BaseBooksAdapter
import io.legato.kazusa.ui.main.bookshelf.books.styleDefalut.BooksAdapterGrid
import io.legato.kazusa.ui.main.bookshelf.books.styleDefalut.BooksAdapterList
import io.legato.kazusa.utils.bookshelfLayout import io.legato.kazusa.utils.bookshelfLayout
import io.legato.kazusa.utils.cnCompare import io.legato.kazusa.utils.cnCompare
import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChangeFirst import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChangeFirst
@@ -147,12 +149,12 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
} }
} }
fun upBookSort(sort: Int) { fun upBookSort() {
binding.root.post { // binding.root.post {
arguments?.putInt("bookSort", sort) // arguments?.putInt("bookSort", sort)
bookSort = sort // bookSort = sort
upRecyclerData() upRecyclerData()
} // }
} }
fun setEnableRefresh(enable: Boolean) { fun setEnableRefresh(enable: Boolean) {
@@ -168,24 +170,36 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
booksFlowJob = viewLifecycleOwner.lifecycleScope.launch { booksFlowJob = viewLifecycleOwner.lifecycleScope.launch {
appDb.bookDao.flowByGroup(groupId).map { list -> appDb.bookDao.flowByGroup(groupId).map { list ->
//排序 //排序
val isDescending = AppConfig.bookshelfSortOrder == 1
when (bookSort) { when (bookSort) {
1 -> list.sortedByDescending { it.latestChapterTime } 1 -> if (isDescending) list.sortedByDescending { it.latestChapterTime }
2 -> list.sortedWith { o1, o2 -> else list.sortedBy { it.latestChapterTime }
o1.name.cnCompare(o2.name)
}
3 -> list.sortedBy { it.order } 2 -> if (isDescending)
list.sortedWith { o1, o2 -> o2.name.cnCompare(o1.name) }
else
list.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) }
// 综合排序 issue #3192 3 -> if (isDescending) list.sortedByDescending { it.order }
4 -> list.sortedByDescending { else list.sortedBy { it.order }
max(it.latestChapterTime, it.durChapterTime)
}
// 按作者排序
5 -> list.sortedWith { o1, o2 ->
o1.author.cnCompare(o2.author)
}
else -> list.sortedByDescending { it.durChapterTime } 4 -> if (isDescending) list.sortedByDescending {
max(
it.latestChapterTime,
it.durChapterTime
)
}
else list.sortedBy { max(it.latestChapterTime, it.durChapterTime) }
5 -> if (isDescending)
list.sortedWith { o1, o2 -> o2.author.cnCompare(o1.author) }
else
list.sortedWith { o1, o2 -> o1.author.cnCompare(o2.author) }
else -> if (isDescending) list.sortedByDescending { it.durChapterTime }
else list.sortedBy { it.durChapterTime }
} }
}.flowWithLifecycleAndDatabaseChangeFirst( }.flowWithLifecycleAndDatabaseChangeFirst(
viewLifecycleOwner.lifecycle, viewLifecycleOwner.lifecycle,
@@ -197,7 +211,6 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
binding.tvEmptyMsg.isGone = list.isNotEmpty() binding.tvEmptyMsg.isGone = list.isNotEmpty()
binding.refreshLayout.isEnabled = enableRefresh && list.isNotEmpty() binding.refreshLayout.isEnabled = enableRefresh && list.isNotEmpty()
booksAdapter.setItems(list) booksAdapter.setItems(list)
delay(100)
} }
} }
} }
@@ -1,6 +1,6 @@
@file:Suppress("DEPRECATION") @file:Suppress("DEPRECATION")
package io.legato.kazusa.ui.main.bookshelf.style1 package io.legato.kazusa.ui.main.bookshelf.books
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
@@ -19,7 +19,6 @@ import io.legato.kazusa.help.config.AppConfig
import io.legato.kazusa.ui.book.group.GroupEditDialog import io.legato.kazusa.ui.book.group.GroupEditDialog
import io.legato.kazusa.ui.book.search.SearchActivity import io.legato.kazusa.ui.book.search.SearchActivity
import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment
import io.legato.kazusa.ui.main.bookshelf.style1.books.BooksFragment
import io.legato.kazusa.utils.showDialogFragment import io.legato.kazusa.utils.showDialogFragment
import io.legato.kazusa.utils.toastOnUi import io.legato.kazusa.utils.toastOnUi
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
@@ -116,11 +115,8 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1)
if (it is BooksFragment) { if (it is BooksFragment) {
val position = it.position val position = it.position
val group = bookGroups.getOrNull(position) ?: return@forEach val group = bookGroups.getOrNull(position) ?: return@forEach
val newSort = group.getRealBookSort()
it.setEnableRefresh(group.enableRefresh) it.setEnableRefresh(group.enableRefresh)
if (it.bookSort != newSort) { it.upBookSort()
it.upBookSort(newSort)
}
} }
} }
} }
@@ -1,4 +1,4 @@
package io.legato.kazusa.ui.main.bookshelf.style2 package io.legato.kazusa.ui.main.bookshelf.books
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
@@ -24,6 +24,9 @@ import io.legato.kazusa.ui.book.group.GroupEditDialog
import io.legato.kazusa.ui.book.info.BookInfoActivity import io.legato.kazusa.ui.book.info.BookInfoActivity
import io.legato.kazusa.ui.book.search.SearchActivity import io.legato.kazusa.ui.book.search.SearchActivity
import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment
import io.legato.kazusa.ui.main.bookshelf.books.styleFold.BaseBooksAdapter
import io.legato.kazusa.ui.main.bookshelf.books.styleFold.BooksAdapterGrid
import io.legato.kazusa.ui.main.bookshelf.books.styleFold.BooksAdapterList
import io.legato.kazusa.utils.bookshelfLayout import io.legato.kazusa.utils.bookshelfLayout
import io.legato.kazusa.utils.cnCompare import io.legato.kazusa.utils.cnCompare
import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChangeFirst import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChangeFirst
@@ -39,7 +42,6 @@ import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.Locale
import kotlin.math.max import kotlin.math.max
/** /**
@@ -69,7 +71,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
private var bookGroups: List<BookGroup> = emptyList() private var bookGroups: List<BookGroup> = emptyList()
private var booksFlowJob: Job? = null private var booksFlowJob: Job? = null
override var groupId = BookGroup.IdRoot override var groupId = BookGroup.Companion.IdRoot
private var allBooks: List<Book> = emptyList() private var allBooks: List<Book> = emptyList()
override var books: List<Book> = emptyList() override var books: List<Book> = emptyList()
private var enableRefresh = true private var enableRefresh = true
@@ -134,7 +136,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
allBooksFlowJob?.cancel() allBooksFlowJob?.cancel()
allBooksFlowJob = viewLifecycleOwner.lifecycleScope.launch { allBooksFlowJob = viewLifecycleOwner.lifecycleScope.launch {
appDb.bookDao.flowAll().map { list -> appDb.bookDao.flowAll().map { list ->
when (AppConfig.getBookSortByGroupId(BookGroup.IdRoot)) { when (AppConfig.getBookSortByGroupId(BookGroup.Companion.IdRoot)) {
1 -> list.sortedByDescending { it.latestChapterTime } 1 -> list.sortedByDescending { it.latestChapterTime }
2 -> list.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) } 2 -> list.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) }
3 -> list.sortedBy { it.order } 3 -> list.sortedBy { it.order }
@@ -144,7 +146,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
}.flowWithLifecycleAndDatabaseChangeFirst( }.flowWithLifecycleAndDatabaseChangeFirst(
viewLifecycleOwner.lifecycle, viewLifecycleOwner.lifecycle,
Lifecycle.State.RESUMED, Lifecycle.State.RESUMED,
AppDatabase.BOOK_TABLE_NAME AppDatabase.Companion.BOOK_TABLE_NAME
).catch { ).catch {
AppLog.put("所有书籍更新出错", it) AppLog.put("所有书籍更新出错", it)
}.conflate().flowOn(Dispatchers.Default).collect { list -> }.conflate().flowOn(Dispatchers.Default).collect { list ->
@@ -156,7 +158,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
} }
private fun initBooksData() { private fun initBooksData() {
if (groupId == BookGroup.IdRoot) { if (groupId == BookGroup.Companion.IdRoot) {
if (isAdded) { if (isAdded) {
binding.titleBar.title = getString(R.string.bookshelf) binding.titleBar.title = getString(R.string.bookshelf)
binding.refreshLayout.isEnabled = true binding.refreshLayout.isEnabled = true
@@ -173,9 +175,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
} }
booksFlowJob?.cancel() booksFlowJob?.cancel()
booksFlowJob = viewLifecycleOwner.lifecycleScope.launch { booksFlowJob = viewLifecycleOwner.lifecycleScope.launch {
appDb.bookDao.flowByGroup(groupId).map { list -> appDb.bookDao.flowByGroup(groupId).map { list ->
//排序 //排序
val isDescending = AppConfig.bookshelfSortOrder == 1 val isDescending = AppConfig.bookshelfSortOrder == 1
@@ -183,15 +183,27 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
1 -> if (isDescending) list.sortedByDescending { it.latestChapterTime } 1 -> if (isDescending) list.sortedByDescending { it.latestChapterTime }
else list.sortedBy { it.latestChapterTime } else list.sortedBy { it.latestChapterTime }
2 -> if (isDescending) list.sortedWith(compareByDescending { it.name.cnCompareKey() }) 2 -> if (isDescending)
else list.sortedWith(compareBy { it.name.cnCompareKey() }) list.sortedWith { o1, o2 -> o2.name.cnCompare(o1.name) }
else
list.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) }
3 -> if (isDescending) list.sortedByDescending { it.order } 3 -> if (isDescending) list.sortedByDescending { it.order }
else list.sortedBy { it.order } else list.sortedBy { it.order }
4 -> if (isDescending) list.sortedByDescending { max(it.latestChapterTime, it.durChapterTime) } 4 -> if (isDescending) list.sortedByDescending {
max(
it.latestChapterTime,
it.durChapterTime
)
}
else list.sortedBy { max(it.latestChapterTime, it.durChapterTime) } else list.sortedBy { max(it.latestChapterTime, it.durChapterTime) }
5 -> if (isDescending)
list.sortedWith { o1, o2 -> o2.author.cnCompare(o1.author) }
else
list.sortedWith { o1, o2 -> o1.author.cnCompare(o2.author) }
else -> if (isDescending) list.sortedByDescending { it.durChapterTime } else -> if (isDescending) list.sortedByDescending { it.durChapterTime }
else list.sortedBy { it.durChapterTime } else list.sortedBy { it.durChapterTime }
} }
@@ -199,7 +211,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
}.flowWithLifecycleAndDatabaseChangeFirst( }.flowWithLifecycleAndDatabaseChangeFirst(
viewLifecycleOwner.lifecycle, viewLifecycleOwner.lifecycle,
Lifecycle.State.RESUMED, Lifecycle.State.RESUMED,
AppDatabase.BOOK_TABLE_NAME AppDatabase.Companion.BOOK_TABLE_NAME
).catch { ).catch {
AppLog.put("书架更新出错", it) AppLog.put("书架更新出错", it)
}.conflate().flowOn(Dispatchers.Default).collect { list -> }.conflate().flowOn(Dispatchers.Default).collect { list ->
@@ -211,13 +223,9 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
} }
} }
fun String.cnCompareKey(): String {
return this.trim().lowercase(Locale.getDefault())
}
fun back(): Boolean { fun back(): Boolean {
if (groupId != BookGroup.IdRoot) { if (groupId != BookGroup.Companion.IdRoot) {
groupId = BookGroup.IdRoot groupId = BookGroup.Companion.IdRoot
initBooksData() initBooksData()
return true return true
} }
@@ -225,7 +233,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
} }
override fun onQueryTextSubmit(query: String?): Boolean { override fun onQueryTextSubmit(query: String?): Boolean {
SearchActivity.start(requireContext(), query) SearchActivity.Companion.start(requireContext(), query)
return false return false
} }
@@ -268,7 +276,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
} }
fun getItemCount(): Int { fun getItemCount(): Int {
return if (groupId == BookGroup.IdRoot) { return if (groupId == BookGroup.Companion.IdRoot) {
bookGroups.size + books.size bookGroups.size + books.size
} else { } else {
books.size books.size
@@ -276,7 +284,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
} }
override fun getItems(): List<Any> { override fun getItems(): List<Any> {
return if (groupId == BookGroup.IdRoot) { return if (groupId == BookGroup.Companion.IdRoot) {
bookGroups + books bookGroups + books
} else { } else {
books books
@@ -1,6 +1,6 @@
@file:Suppress("DEPRECATION") @file:Suppress("DEPRECATION")
package io.legato.kazusa.ui.main.bookshelf.style1 package io.legato.kazusa.ui.main.bookshelf.books
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
@@ -18,7 +18,6 @@ import io.legato.kazusa.databinding.FragmentBookshelf3Binding
import io.legato.kazusa.help.config.AppConfig import io.legato.kazusa.help.config.AppConfig
import io.legato.kazusa.ui.book.search.SearchActivity import io.legato.kazusa.ui.book.search.SearchActivity
import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment
import io.legato.kazusa.ui.main.bookshelf.style1.books.BooksFragment
import io.legato.kazusa.utils.viewbindingdelegate.viewBinding import io.legato.kazusa.utils.viewbindingdelegate.viewBinding
import kotlin.collections.set import kotlin.collections.set
@@ -109,11 +108,8 @@ class BookshelfFragment3() : BaseBookshelfFragment(R.layout.fragment_bookshelf3)
if (it is BooksFragment) { if (it is BooksFragment) {
val position = it.position val position = it.position
val group = bookGroups.getOrNull(position) ?: return@forEach val group = bookGroups.getOrNull(position) ?: return@forEach
val newSort = group.getRealBookSort()
it.setEnableRefresh(group.enableRefresh) it.setEnableRefresh(group.enableRefresh)
if (it.bookSort != newSort) { it.upBookSort()
it.upBookSort(newSort)
}
} }
} }
} }
@@ -1,4 +1,4 @@
package io.legato.kazusa.ui.main.bookshelf.style1.books package io.legato.kazusa.ui.main.bookshelf.books.styleDefalut
import android.content.Context import android.content.Context
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
@@ -1,4 +1,4 @@
package io.legato.kazusa.ui.main.bookshelf.style1.books package io.legato.kazusa.ui.main.bookshelf.books.styleDefalut
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
@@ -1,4 +1,4 @@
package io.legato.kazusa.ui.main.bookshelf.style1.books package io.legato.kazusa.ui.main.bookshelf.books.styleDefalut
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
@@ -1,4 +1,4 @@
package io.legato.kazusa.ui.main.bookshelf.style2 package io.legato.kazusa.ui.main.bookshelf.books.styleFold
import android.content.Context import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
@@ -1,4 +1,4 @@
package io.legato.kazusa.ui.main.bookshelf.style2 package io.legato.kazusa.ui.main.bookshelf.books.styleFold
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
@@ -1,4 +1,4 @@
package io.legato.kazusa.ui.main.bookshelf.style2 package io.legato.kazusa.ui.main.bookshelf.books.styleFold
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
@@ -144,7 +144,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:layout_marginVertical="8dp" android:layout_marginVertical="8dp"
android:layout_marginHorizontal="16dp"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:gravity="center" android:gravity="center"
android:orientation="horizontal"> android:orientation="horizontal">
@@ -198,7 +197,7 @@
android:gravity="end" android:gravity="end"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:paddingVertical="8dp" android:paddingVertical="8dp"
android:paddingHorizontal="16dp" android:paddingEnd="16dp"
android:orientation="horizontal"> android:orientation="horizontal">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
@@ -1,222 +1,225 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:fillViewport="true" android:fillViewport="true">
android:paddingHorizontal="16dp"
android:paddingVertical="8dp"
android:orientation="vertical">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:fillViewport="true"
android:gravity="center" android:paddingHorizontal="16dp"
android:paddingVertical="8dp" android:paddingVertical="8dp"
android:paddingHorizontal="16dp"> android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:paddingVertical="8dp"
android:paddingHorizontal="16dp">
<View
android:layout_width="36dp"
android:layout_height="4dp"
android:layout_gravity="center_horizontal"
android:background="@drawable/bg_bottom_sheet_handle"
android:layout_marginBottom="16dp" />
<TextView
android:id="@+id/bottom_sheet_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bookshelf_layout"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_show_unread"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_unread"
tools:ignore="TouchTargetSizeCheck" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_show_last_update_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_last_update_time"
tools:ignore="TouchTargetSizeCheck" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_show_wait_up_books"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_wait_up_count"
tools:ignore="TouchTargetSizeCheck" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_show_bookshelf_fast_scroller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_bookshelf_fast_scroller"
tools:ignore="TouchTargetSizeCheck" />
<View
android:layout_width="36dp"
android:layout_height="4dp"
android:layout_gravity="center_horizontal"
android:background="@drawable/bg_bottom_sheet_handle"
android:layout_marginBottom="16dp" />
<TextView <TextView
android:id="@+id/bottom_sheet_title" android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/bookshelf_layout" android:paddingTop="8dp"
android:textSize="18sp" android:text="@string/group_style"
android:textStyle="bold" />
</LinearLayout>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_show_unread"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_unread"
tools:ignore="TouchTargetSizeCheck" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_show_last_update_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_last_update_time"
tools:ignore="TouchTargetSizeCheck" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_show_wait_up_books"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_wait_up_count"
tools:ignore="TouchTargetSizeCheck" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/sw_show_bookshelf_fast_scroller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_bookshelf_fast_scroller"
tools:ignore="TouchTargetSizeCheck" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:text="@string/group_style"
android:textSize="14sp"
android:textStyle="bold" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/chip_group_style"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkableBehavior="single"
android:paddingBottom="8dp"
app:singleSelection="true"
app:selectionRequired="true">
</com.google.android.material.chip.ChipGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="排列视图"
android:textSize="14sp" android:textSize="14sp"
android:textStyle="bold" /> android:textStyle="bold" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<com.google.android.material.chip.ChipGroup <com.google.android.material.chip.ChipGroup
android:id="@+id/chip_group_layout" android:id="@+id/chip_group_style"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:checkableBehavior="single"
android:paddingBottom="8dp"
app:singleSelection="true" app:singleSelection="true"
app:selectionRequired="true"> app:selectionRequired="true">
<com.google.android.material.chip.Chip
android:id="@+id/chip_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="列表" />
<com.google.android.material.chip.Chip
android:id="@+id/chip_grid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="网格" />
</com.google.android.material.chip.ChipGroup> </com.google.android.material.chip.ChipGroup>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
<TextView
android:id="@+id/slider_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="每行列数"
android:textSize="14sp"
android:textStyle="bold"
android:paddingTop="8dp" />
<com.google.android.material.slider.Slider
android:id="@+id/slider_grid_count"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="8dp"
android:valueFrom="1"
android:valueTo="9"
android:stepSize="1"
android:value="3" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:orientation="horizontal"
android:text="@string/sort" android:paddingTop="8dp">
android:textSize="14sp"
android:textStyle="bold" />
<View <TextView
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_weight="1"/> android:layout_gravity="center_vertical"
android:text="排列视图"
android:textSize="14sp"
android:textStyle="bold" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<com.google.android.material.chip.ChipGroup
android:id="@+id/chip_group_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:singleSelection="true"
app:selectionRequired="true">
<com.google.android.material.chip.Chip
android:id="@+id/chip_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="列表" />
<com.google.android.material.chip.Chip
android:id="@+id/chip_grid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="网格" />
</com.google.android.material.chip.ChipGroup>
</LinearLayout>
<TextView
android:id="@+id/slider_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="每行列数"
android:textSize="14sp"
android:textStyle="bold"
android:paddingTop="8dp" />
<com.google.android.material.slider.Slider
android:id="@+id/slider_grid_count"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="8dp"
android:valueFrom="1"
android:valueTo="9"
android:stepSize="1"
android:value="3" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/sort"
android:textSize="14sp"
android:textStyle="bold" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroupOrder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:singleSelection="true">
<com.google.android.material.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/chip_asc"
android:text="升序"
android:checkable="true" />
<com.google.android.material.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/chip_desc"
android:text="降序"
android:checkable="true" />
</com.google.android.material.chip.ChipGroup>
</LinearLayout>
<com.google.android.material.chip.ChipGroup <com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroupOrder" android:id="@+id/chip_group_sort"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:singleSelection="true"> app:singleSelection="true"
app:selectionRequired="true"
android:orientation="horizontal" />
<com.google.android.material.chip.Chip <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnCancel"
style="@style/Widget.Material3.Button.OutlinedButton"
android:text="取消"
android:layout_marginEnd="8dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content" />
android:id="@+id/chip_asc"
android:text="升序" <com.google.android.material.button.MaterialButton
android:checkable="true" /> android:id="@+id/btnOk"
style="@style/Widget.Material3.Button"
android:text="确定"
<com.google.android.material.chip.Chip
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content" />
android:id="@+id/chip_desc"
android:text="降序" </LinearLayout>
android:checkable="true" />
</com.google.android.material.chip.ChipGroup>
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView>
<com.google.android.material.chip.ChipGroup
android:id="@+id/chip_group_sort"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:singleSelection="true"
app:selectionRequired="true"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:orientation="horizontal" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnCancel"
style="@style/Widget.Material3.Button.OutlinedButton"
android:text="取消"
android:layout_marginEnd="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnOk"
style="@style/Widget.Material3.Button"
android:text="确定"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ScrollView <androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android" 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"
xmlns:tool="http://schemas.android.com/tools" xmlns:tool="http://schemas.android.com/tools"
@@ -309,4 +309,4 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</ScrollView> </androidx.core.widget.NestedScrollView>