From 44b35590d42d550bd64006bc4d90f70decdc6f2f Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Wed, 3 Sep 2025 04:15:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B9=B3=E6=9D=BF=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=9B=B4=E6=96=B0=E4=B8=BB?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legato/kazusa/constant/PreferKey.kt | 4 +- .../io/legato/kazusa/help/config/AppConfig.kt | 6 + .../kazusa/ui/config/ThemeConfigFragment.kt | 4 + .../io/legato/kazusa/ui/main/MainActivity.kt | 119 ++++++++++++++---- .../main/res/layout-land/activity_main.xml | 28 ----- app/src/main/res/layout/activity_main.xml | 18 ++- .../main/res/layout/navigation_rail_fab.xml | 26 ++++ app/src/main/res/values-zh/arrays.xml | 6 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/array_values.xml | 7 ++ app/src/main/res/values/arrays.xml | 7 ++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_config_theme.xml | 7 ++ 13 files changed, 180 insertions(+), 54 deletions(-) delete mode 100644 app/src/main/res/layout-land/activity_main.xml create mode 100644 app/src/main/res/layout/navigation_rail_fab.xml diff --git a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt index c1830c9a3..bf834adcd 100644 --- a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt +++ b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt @@ -209,8 +209,8 @@ object PreferKey { const val delayBookLoadEnable = "delayBookLoadEnable" const val sharedElementEnterTransitionEnable = "sharedElementEnterTransitionEnable" - const val bookshelfLayoutGridLandscape = "bookshelfLayoutGridLandscape" - const val bookshelfLayoutGridPortrait = "bookshelfLayoutGridPortrait" + + const val tabletInterface = "tabletInterface" } diff --git a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt index d2bfced18..9beeb3113 100644 --- a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt +++ b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt @@ -808,5 +808,11 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.putPrefBoolean(PreferKey.mangaVolumeKeyPage, value) } + var tabletInterface + get() = appCtx.getPrefString(PreferKey.tabletInterface, "auto") + set(value) { + appCtx.putPrefString(PreferKey.tabletInterface, value) + } + } diff --git a/app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt index 2e032b238..5d747e92e 100644 --- a/app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt @@ -158,6 +158,10 @@ class ThemeConfigFragment : PreferenceFragmentCompat(), PreferKey.bgImageN -> { upPreferenceSummary(key, getPrefString(key)) } + + PreferKey.tabletInterface -> { + recreateActivities() + } } } diff --git a/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt b/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt index cde53ffb1..6afab4d2b 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt @@ -5,12 +5,16 @@ package io.legato.kazusa.ui.main import android.content.res.Configuration import android.os.Bundle import android.text.format.DateUtils +import android.view.Gravity import android.view.MenuItem import android.view.MotionEvent import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.ImageView import androidx.activity.addCallback import androidx.activity.viewModels import androidx.core.view.get +import androidx.core.view.isVisible import androidx.core.view.postDelayed import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager @@ -18,6 +22,7 @@ import androidx.fragment.app.FragmentStatePagerAdapter import androidx.lifecycle.lifecycleScope import androidx.viewpager.widget.ViewPager import com.google.android.material.bottomnavigation.BottomNavigationView +import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.navigation.NavigationBarView import io.legato.kazusa.BuildConfig import io.legato.kazusa.R @@ -35,6 +40,7 @@ import io.legato.kazusa.help.storage.Backup import io.legato.kazusa.lib.dialogs.alert import io.legato.kazusa.service.BaseReadAloudService import io.legato.kazusa.ui.about.CrashLogsDialog +import io.legato.kazusa.ui.book.search.SearchActivity import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment1 import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment2 @@ -44,9 +50,9 @@ import io.legato.kazusa.ui.main.my.MyFragment import io.legato.kazusa.ui.main.rss.RssFragment import io.legato.kazusa.ui.welcome.WelcomeActivity import io.legato.kazusa.ui.widget.dialog.TextDialog +import io.legato.kazusa.utils.dpToPx import io.legato.kazusa.utils.gone import io.legato.kazusa.utils.hideSoftInput -import io.legato.kazusa.utils.isCreated import io.legato.kazusa.utils.observeEvent import io.legato.kazusa.utils.setNavigationBarColorAuto import io.legato.kazusa.utils.shouldHideSoftInput @@ -107,6 +113,10 @@ class MainActivity : VMBaseActivity(), return } + if (savedInstanceState != null) { + pagePosition = savedInstanceState.getInt("currentPagePosition", 0) + } + onBackPressedDispatcher.addCallback(this) { if (pagePosition != 0) { binding.viewPagerMain.currentItem = 0 @@ -133,6 +143,7 @@ class MainActivity : VMBaseActivity(), upBottomMenu() initView() upHomePage() + bindNavigationListener() } override fun dispatchTouchEvent(ev: MotionEvent): Boolean { @@ -212,12 +223,6 @@ class MainActivity : VMBaseActivity(), viewPagerMain.offscreenPageLimit = 3 viewPagerMain.adapter = adapter viewPagerMain.addOnPageChangeListener(PageChangeCallback()) - getNavigationBarView().apply { - setOnItemSelectedListener { onNavigationItemSelected(it) } - setOnItemReselectedListener { onNavigationItemReselected(it) } - } - - window.setNavigationBarColorAuto(themeColor(com.google.android.material.R.attr.colorSurfaceContainer)) } @@ -287,6 +292,7 @@ class MainActivity : VMBaseActivity(), override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) + outState.putInt("currentPagePosition", pagePosition) if (AppConfig.autoRefreshBook) { outState.putBoolean("isAutoRefreshedBook", true) } @@ -333,18 +339,33 @@ class MainActivity : VMBaseActivity(), } private fun getNavigationBarView(): NavigationBarView { - return findViewById( - if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) - R.id.bottom_navigation_view - else - R.id.navigation_rail_view - ) + val tabletInterface = AppConfig.tabletInterface + val orientation = resources.configuration.orientation + val smallestWidthDp = resources.configuration.smallestScreenWidthDp + + val useRail = when (tabletInterface) { + "always" -> true + "landscape" -> orientation == Configuration.ORIENTATION_LANDSCAPE + "off" -> false + "auto" -> smallestWidthDp >= 600 + else -> false + } + + // 控制显隐 + binding.navigationRailView.isVisible = useRail + binding.bottomNavigationView.isVisible = !useRail + + return if (useRail) binding.navigationRailView else binding.bottomNavigationView } + private fun upBottomMenu() { - val menu = getNavigationBarView().menu + val navView = getNavigationBarView() + val menu = navView.menu + menu.findItem(R.id.menu_discovery).isVisible = AppConfig.showDiscovery menu.findItem(R.id.menu_rss).isVisible = AppConfig.showRSS + var index = 0 if (AppConfig.showDiscovery) { index++ @@ -357,9 +378,65 @@ class MainActivity : VMBaseActivity(), index++ realPositions[index] = idMy bottomMenuCount = index + 1 + adapter.notifyDataSetChanged() - if (AppConfig.showBottomView) getNavigationBarView().visible() - else binding.bottomNavigationView?.gone() + + if (AppConfig.showBottomView) { + navView.visible() + } else { + binding.bottomNavigationView.gone() + binding.navigationRailView.gone() + } + + val efab = + binding.navigationRailView.headerView?.findViewById(R.id.nav_fab) + efab?.let { it.isExtended = false } + + val lp = + binding.navigationRailView.headerView?.let { it.layoutParams as FrameLayout.LayoutParams } + lp!!.gravity = Gravity.START + + binding.navigationRailView.headerView?.setPadding( + 12.dpToPx(), + 12.dpToPx(), + 12.dpToPx(), + 12.dpToPx() + ) + + binding.navigationRailView.headerView?.findViewById(R.id.nav_fab) + ?.setOnClickListener { + startActivity() + } + binding.navigationRailView.headerView?.findViewById(R.id.nav_botton) + ?.setOnClickListener { + efab?.let { it1 -> + if (it1.isExtended) { + efab.isExtended = false + binding.navigationRailView.collapse() + } else { + efab.isExtended = true + binding.navigationRailView.expand() + } + } + } + } + + private fun bindNavigationListener() { + val navView = getNavigationBarView() + navView.setOnItemSelectedListener { onNavigationItemSelected(it) } + navView.setOnItemReselectedListener { onNavigationItemReselected(it) } + binding.viewPagerMain.post { + binding.viewPagerMain.setCurrentItem(pagePosition, false) + getNavigationBarView().menu[pagePosition].isChecked = true + } + } + + private fun updateNavigationRailFab(position: Int) { + binding.navigationRailView.headerView?.gone() + val fragmentId = getFragmentId(position) + if (fragmentId == idBookshelf1 || fragmentId == idBookshelf2 || fragmentId == idBookshelf3) { + binding.navigationRailView.headerView?.visible() + } } private fun upHomePage() { @@ -397,7 +474,9 @@ class MainActivity : VMBaseActivity(), override fun onPageSelected(position: Int) { pagePosition = position - getNavigationBarView().menu[realPositions[position]].isChecked = true + val navView = getNavigationBarView() + navView.menu[realPositions[position]].isChecked = true + updateNavigationRailFab(position) } } @@ -443,11 +522,7 @@ class MainActivity : VMBaseActivity(), } override fun instantiateItem(container: ViewGroup, position: Int): Any { - 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 - } + val fragment = super.instantiateItem(container, position) as Fragment fragmentMap[getId(position)] = fragment return fragment } diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml deleted file mode 100644 index 123b11ab5..000000000 --- a/app/src/main/res/layout-land/activity_main.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index cdc794141..62f963473 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,11 +7,11 @@ @@ -20,9 +20,23 @@ android:id="@+id/bottom_navigation_view" android:layout_width="match_parent" android:layout_height="wrap_content" + android:visibility="visible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:menu="@menu/main_bnv" /> + + diff --git a/app/src/main/res/layout/navigation_rail_fab.xml b/app/src/main/res/layout/navigation_rail_fab.xml new file mode 100644 index 000000000..82c9d8332 --- /dev/null +++ b/app/src/main/res/layout/navigation_rail_fab.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/arrays.xml b/app/src/main/res/values-zh/arrays.xml index a570b032c..a2e7ec2c9 100644 --- a/app/src/main/res/values-zh/arrays.xml +++ b/app/src/main/res/values-zh/arrays.xml @@ -124,5 +124,11 @@ @string/bookshelf_px_5 + + 自动 + 总是 + 横屏时 + 关闭 + \ No newline at end of file diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index e6497f397..6e3d6da5a 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1242,4 +1242,5 @@ 系统媒体控件兼容性更改 当锁屏不显示系统媒体控件时可以尝试开启,比如 OneUI 7.0或 OriginOS 等 朗读暂停/继续 + 平板界面 diff --git a/app/src/main/res/values/array_values.xml b/app/src/main/res/values/array_values.xml index 72bef30db..0dcdd4798 100644 --- a/app/src/main/res/values/array_values.xml +++ b/app/src/main/res/values/array_values.xml @@ -64,4 +64,11 @@ en + + auto + always + landscape + off + + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 457934543..f2d05ae9d 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -152,6 +152,13 @@ English + + Auto + Always + In_Landscape_Mode + Off + + BookSource RssSource diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73ce4fea7..1879b9dbe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1247,4 +1247,5 @@ 当锁屏不显示系统媒体控件时可以尝试开启,比如 OneUI 7.0或 OriginOS 等 朗读暂停/继续 播放模式 + 平板界面 diff --git a/app/src/main/res/xml/pref_config_theme.xml b/app/src/main/res/xml/pref_config_theme.xml index 11792a98a..f576afa64 100644 --- a/app/src/main/res/xml/pref_config_theme.xml +++ b/app/src/main/res/xml/pref_config_theme.xml @@ -40,6 +40,13 @@ app:iconSpaceReserved="false" app:icons="@array/icons" /> + +