feat(layout): 优化模组详情页面布局

- 修改了 activity_web_mod_info.xml 和 fragment_insert_coins.xml 等布局文件
- 为平板设备添加了专门的布局文件 activity_web_mod_info.xml (横屏模式)
- 调整了布局结构,优化了页面展示效果
- 移除了不必要的 android:fitsSystemWindows 属性- 更改了部分视图的布局参数,使其适应不同屏幕尺寸
This commit is contained in:
muqing 2025-01-17 21:03:14 +08:00
parent e77d3a390d
commit 37a9c0968f
9 changed files with 258 additions and 96 deletions

View File

@ -32,7 +32,7 @@ android {
minSdkVersion 23
targetSdkVersion 33
versionCode 28
versionName "2.1.1 Test(2024-7-20)"
versionName "2.3.0 Test(2025-One)"// One Two Three Four
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

View File

@ -1,9 +1,11 @@
package com.coldmint.rust.pro
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.os.Environment
import android.view.*
import androidx.lifecycle.MutableLiveData
import com.coldmint.dialog.CoreDialog
import com.coldmint.rust.core.dataBean.AppUpdateData
import com.coldmint.rust.core.tool.AppOperator
@ -15,8 +17,10 @@ import com.coldmint.rust.pro.adapters.ModPageDetailsAdapter
import com.coldmint.rust.pro.base.BaseActivity
import com.coldmint.rust.pro.databinding.ActivityWebModInfoBinding
import com.coldmint.rust.pro.databinding.LoadFileLayoutBinding
import com.coldmint.rust.pro.fragments.WebModDetailsFragment
import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod
import com.coldmint.rust.pro.tool.Tools
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayoutMediator
import com.google.gson.Gson
@ -44,6 +48,10 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
}
lateinit var adapter: ModPageDetailsAdapter
val modName: MutableLiveData<String> by lazy {
MutableLiveData()
}
@SuppressLint("CommitTransaction")
private fun initView() {
setReturnButton()
val activityIntent = intent
@ -64,27 +72,52 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
viewBinding.button.isEnabled = false
viewBinding.button.text = getString(R.string.installated)
}
adapter = ModPageDetailsAdapter(this, modId)
adapter.modName.observe(this) {
modName.observe(this) {
title = it
}
val webModDetailsFragment = WebModDetailsFragment(modId, modName)
// 检测是否处于平板模式
if (Tools.isTabletMode(this)) {
adapter = ModPageDetailsAdapter(this, modId)
supportFragmentManager.beginTransaction()
.replace(R.id.fragment,webModDetailsFragment)
.commit()
viewBinding.viewPager2.adapter = adapter
TabLayoutMediator(viewBinding.tabLayout, viewBinding.viewPager2) { tab, i ->
tab.text = when (i) {
0 -> {
getString(R.string.insert_coins)
}
1 -> {
getString(R.string.discussion)
}else -> {
getString(R.string.title)
}
}
}.attach()
} else {
adapter = ModPageDetailsAdapter(this, modId, webModDetailsFragment)
viewBinding.viewPager2.adapter = adapter
TabLayoutMediator(viewBinding.tabLayout, viewBinding.viewPager2) { tab, i ->
tab.text = when (i) {
0 -> {
getString(R.string.details)
}
1 -> {
getString(R.string.insert_coins)
}
2 -> {
getString(R.string.discussion)
}
else -> {
getString(R.string.title)
}
}
}.attach()
}
viewBinding.button.setOnClickListener {
val type = viewBinding.button.text
val installation = getString(R.string.installation)
@ -127,9 +160,11 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
}.show()
}
}
AppOperator.NetWorkType.NetWorkType_Wifi -> {
downloadWork(fileLink)
}
else -> {}
}
@ -143,6 +178,7 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
}
@SuppressLint("StringFormatInvalid")
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.report_item -> {
@ -171,15 +207,17 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
).show()
}
}
R.id.share_item -> {
val link = AppSettings.getValue(AppSettings.Setting.ServerAddress, "")
val updateData = AppSettings.getValue(AppSettings.Setting.UpdateData, "")
var appUpdateLink = ""
if (!updateData.isNullOrBlank()) {
if (updateData.isNotBlank()) {
val gson = Gson()
val updateDataObj = gson.fromJson(updateData, AppUpdateData.Data::class.java)
appUpdateLink = updateDataObj.link
}
val s = String.format(
getString(R.string.share_mod_msg),
title,
@ -188,6 +226,7 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
AppOperator.shareText(this, getString(R.string.share_mod), s)
}
R.id.update_record -> {
GlobalMethod.showUpdateLog(this, modId)
}

View File

@ -15,19 +15,18 @@ import com.coldmint.rust.pro.fragments.WebModDetailsFragment
* 模组详情页面适配器
* @constructor
*/
class ModPageDetailsAdapter(fragmentActivity: FragmentActivity, val modId: String) :
class ModPageDetailsAdapter(fragmentActivity: FragmentActivity, val modId: String, var A: WebModDetailsFragment? = null) :
FragmentStateAdapter(fragmentActivity) {
private lateinit var webModDetailsFragment: WebModDetailsFragment
private lateinit var modCommentsFragment: ModCommentsFragment
override fun getItemCount(): Int {
if (A == null) {
return 2
} else
return 3
}
val modName: MutableLiveData<String> by lazy {
MutableLiveData()
}
/**
* 获取下载链接
* @return String?
@ -55,25 +54,48 @@ class ModPageDetailsAdapter(fragmentActivity: FragmentActivity, val modId: Strin
}
override fun createFragment(position: Int): Fragment {
if (A == null) {
return when (position) {
0 -> {
InsertCoinsFragment(modId)
}
1 -> {
if (!this::modCommentsFragment.isInitialized) {
modCommentsFragment = ModCommentsFragment(modId)
}
modCommentsFragment
}else -> {
NullFragment()
}
}
} else {
return when (position) {
0 -> {
if (!this::webModDetailsFragment.isInitialized) {
webModDetailsFragment = WebModDetailsFragment(modId, modName)
webModDetailsFragment = A as WebModDetailsFragment
}
webModDetailsFragment
}
1 -> {
InsertCoinsFragment(modId)
}
2 -> {
if (!this::modCommentsFragment.isInitialized) {
modCommentsFragment = ModCommentsFragment(modId)
}
modCommentsFragment
}
else -> {
}else -> {
NullFragment()
}
}
}
//
// else -> {
// NullFragment()
// }
}
}

View File

@ -42,6 +42,7 @@ class ModCommentsFragment(val modId: String) : BaseFragment<FragmentModCommentsB
viewBinding.recyclerView.addItemDecoration(
divider
)
//刷新评论区
viewBinding.swipeRefreshLayout.setOnRefreshListener {
loadCommentList(modId, false)
viewBinding.swipeRefreshLayout.isRefreshing = false

View File

@ -0,0 +1,19 @@
package com.coldmint.rust.pro.tool
import android.app.UiModeManager
import android.content.Context
import android.content.res.Configuration
import androidx.core.content.ContextCompat.getSystemService
class Tools {
companion object {
/**
* 判断是否为平板
*/
fun isTabletMode(context: Context): Boolean {
return context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
}
}
}

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".WebModInfoActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"/>
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="投币" />
<com.google.android.material.tabs.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="评论" />
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
android:text="@string/installation"
app:icon="@drawable/cloud_download" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -4,7 +4,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".WebModInfoActivity">
<com.google.android.material.appbar.AppBarLayout
@ -14,7 +13,7 @@
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_height="wrap_content"
app:layout_collapseMode="pin" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"

View File

@ -1,17 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout 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"
android:layout_width="match_parent"
android:id="@+id/swipeRefreshLayout"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingHorizontal="16dp"
android:paddingTop="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.card.MaterialCardView
@ -66,16 +64,23 @@
android:id="@+id/linearProgressIndicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_marginTop="8dp"
android:indeterminate="true"
android:layout_marginTop="8dp" />
android:visibility="gone" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp" />
android:layout_marginTop="8dp"
android:visibility="gone" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<LinearLayout
android:id="@+id/loadLayout"
@ -85,13 +90,13 @@
<TextView
style="@style/TextAppearance.Material3.HeadlineSmall"
android:text="@string/no_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content"
android:text="@string/no_content" />
</LinearLayout>
</LinearLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/swipeRefreshLayout"
android:paddingHorizontal="16dp"
android:paddingTop="8dp"
tools:context=".fragments.ModCommentsFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
@ -38,18 +38,24 @@
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/linearProgressIndicator"
android:layout_width="match_parent"
android:layout_marginTop="8dp"
android:visibility="invisible"
android:layout_height="wrap_content"
android:indeterminate="true" />
android:layout_marginTop="8dp"
android:indeterminate="true"
android:visibility="invisible" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp" />
android:layout_marginTop="8dp"
android:isScrollContainer="true"
android:visibility="gone" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<LinearLayout
android:id="@+id/noContentLayout"
@ -64,4 +70,4 @@
android:text="@string/no_content" />
</LinearLayout>
</LinearLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>