Compare commits

...

3 Commits

Author SHA1 Message Date
524270dde7 Merge remote-tracking branch 'origin/master' 2025-01-17 21:44:23 +08:00
f80c23c90a refactor(community): 重构社区界面布局和功能
- 移除了底部导航栏
- 优化了推荐页面布局,添加了轮播图和下拉刷新功能- 调整了排名页面布局
- 修复了一些代码注释和未使用变量
2025-01-17 21:44:16 +08:00
37a9c0968f feat(layout): 优化模组详情页面布局
- 修改了 activity_web_mod_info.xml 和 fragment_insert_coins.xml 等布局文件
- 为平板设备添加了专门的布局文件 activity_web_mod_info.xml (横屏模式)
- 调整了布局结构,优化了页面展示效果
- 移除了不必要的 android:fitsSystemWindows 属性- 更改了部分视图的布局参数,使其适应不同屏幕尺寸
2025-01-17 21:03:14 +08:00
15 changed files with 421 additions and 292 deletions

View File

@ -32,7 +32,7 @@ android {
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 33 targetSdkVersion 33
versionCode 28 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" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@ -180,8 +180,8 @@ dependencies {
implementation 'com.google.android.flexbox:flexbox:3.0.0' implementation 'com.google.android.flexbox:flexbox:3.0.0'
// Android智能下拉刷新框架-SmartRefreshLayout // Android智能下拉刷新框架-SmartRefreshLayout
implementation 'io.github.scwang90:refresh-layout-kernel:2.1.0' // implementation 'io.github.scwang90:refresh-layout-kernel:2.1.0' //
implementation 'io.github.scwang90:refresh-header-classics:2.1.0' // implementation 'io.github.scwang90:refresh-header-classics:2.1.0' //
implementation 'io.github.scwang90:refresh-footer-classics:2.1.0' // implementation 'io.github.scwang90:refresh-footer-classics:2.1.0' //
} }

View File

@ -1,9 +1,11 @@
package com.coldmint.rust.pro package com.coldmint.rust.pro
import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Environment import android.os.Environment
import android.view.* import android.view.*
import androidx.lifecycle.MutableLiveData
import com.coldmint.dialog.CoreDialog import com.coldmint.dialog.CoreDialog
import com.coldmint.rust.core.dataBean.AppUpdateData import com.coldmint.rust.core.dataBean.AppUpdateData
import com.coldmint.rust.core.tool.AppOperator 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.base.BaseActivity
import com.coldmint.rust.pro.databinding.ActivityWebModInfoBinding import com.coldmint.rust.pro.databinding.ActivityWebModInfoBinding
import com.coldmint.rust.pro.databinding.LoadFileLayoutBinding 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.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod 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.snackbar.Snackbar
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.google.gson.Gson import com.google.gson.Gson
@ -29,8 +33,8 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
lateinit var tip: String lateinit var tip: String
val targetFile: File by lazy { val targetFile: File by lazy {
val modFolderPath = AppSettings.getValue( val modFolderPath = AppSettings.getValue(
AppSettings.Setting.ModFolder, AppSettings.Setting.ModFolder,
Environment.getExternalStorageDirectory().absolutePath + "/rustedWarfare/units/" Environment.getExternalStorageDirectory().absolutePath + "/rustedWarfare/units/"
) )
val modFolder = File(modFolderPath) val modFolder = File(modFolderPath)
if (!modFolder.exists()) { if (!modFolder.exists()) {
@ -44,6 +48,10 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
} }
lateinit var adapter: ModPageDetailsAdapter lateinit var adapter: ModPageDetailsAdapter
val modName: MutableLiveData<String> by lazy {
MutableLiveData()
}
@SuppressLint("CommitTransaction")
private fun initView() { private fun initView() {
setReturnButton() setReturnButton()
val activityIntent = intent val activityIntent = intent
@ -64,27 +72,52 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
viewBinding.button.isEnabled = false viewBinding.button.isEnabled = false
viewBinding.button.text = getString(R.string.installated) viewBinding.button.text = getString(R.string.installated)
} }
adapter = ModPageDetailsAdapter(this, modId) modName.observe(this) {
adapter.modName.observe(this) {
title = it 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 viewBinding.viewPager2.adapter = adapter
TabLayoutMediator(viewBinding.tabLayout, viewBinding.viewPager2) { tab, i -> TabLayoutMediator(viewBinding.tabLayout, viewBinding.viewPager2) { tab, i ->
tab.text = when (i) { tab.text = when (i) {
0 -> { 0 -> {
getString(R.string.details) getString(R.string.insert_coins)
}
1 -> {
getString(R.string.discussion)
}else -> {
getString(R.string.title)
}
} }
1 -> { }.attach()
getString(R.string.insert_coins) } 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)
}
} }
2 -> { }.attach()
getString(R.string.discussion) }
}
else -> {
getString(R.string.title)
}
}
}.attach()
viewBinding.button.setOnClickListener { viewBinding.button.setOnClickListener {
val type = viewBinding.button.text val type = viewBinding.button.text
val installation = getString(R.string.installation) val installation = getString(R.string.installation)
@ -111,25 +144,27 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
when (AppOperator.getNetworkType(this)) { when (AppOperator.getNetworkType(this)) {
AppOperator.NetWorkType.NetWorkType_Moble -> { AppOperator.NetWorkType.NetWorkType_Moble -> {
val useMobileNetWork = val useMobileNetWork =
AppSettings.getValue(AppSettings.Setting.UseMobileNetwork, false) AppSettings.getValue(AppSettings.Setting.UseMobileNetwork, false)
if (useMobileNetWork) { if (useMobileNetWork) {
downloadWork(fileLink) downloadWork(fileLink)
} else { } else {
CoreDialog(this).setTitle(R.string.using_mobile_networks) CoreDialog(this).setTitle(R.string.using_mobile_networks)
.setMessage(R.string.using_mobile_networks_msg) .setMessage(R.string.using_mobile_networks_msg)
.setPositiveButton(R.string.only_one) { .setPositiveButton(R.string.only_one) {
downloadWork(fileLink) downloadWork(fileLink)
}.setNegativeButton(R.string.always_allow) { }.setNegativeButton(R.string.always_allow) {
AppSettings.setValue(AppSettings.Setting.UseMobileNetwork, true) AppSettings.setValue(AppSettings.Setting.UseMobileNetwork, true)
downloadWork(fileLink) downloadWork(fileLink)
}.setNeutralButton(R.string.dialog_cancel) { }.setNeutralButton(R.string.dialog_cancel) {
}.show() }.show()
} }
} }
AppOperator.NetWorkType.NetWorkType_Wifi -> { AppOperator.NetWorkType.NetWorkType_Wifi -> {
downloadWork(fileLink) downloadWork(fileLink)
} }
else -> {} else -> {}
} }
@ -143,14 +178,15 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
} }
@SuppressLint("StringFormatInvalid")
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.report_item -> { R.id.report_item -> {
if (token.isBlank()) { if (token.isBlank()) {
Snackbar.make( Snackbar.make(
viewBinding.button, viewBinding.button,
R.string.please_login_first, R.string.please_login_first,
Snackbar.LENGTH_SHORT Snackbar.LENGTH_SHORT
).show() ).show()
return true return true
} }
@ -165,29 +201,32 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
} else { } else {
//不能举报未公开的模组 //不能举报未公开的模组
Snackbar.make( Snackbar.make(
viewBinding.button, viewBinding.button,
R.string.unable_to_report, R.string.unable_to_report,
Snackbar.LENGTH_SHORT Snackbar.LENGTH_SHORT
).show() ).show()
} }
} }
R.id.share_item -> { R.id.share_item -> {
val link = AppSettings.getValue(AppSettings.Setting.ServerAddress, "") val link = AppSettings.getValue(AppSettings.Setting.ServerAddress, "")
val updateData = AppSettings.getValue(AppSettings.Setting.UpdateData, "") val updateData = AppSettings.getValue(AppSettings.Setting.UpdateData, "")
var appUpdateLink = "" var appUpdateLink = ""
if (!updateData.isNullOrBlank()) { if (updateData.isNotBlank()) {
val gson = Gson() val gson = Gson()
val updateDataObj = gson.fromJson(updateData, AppUpdateData.Data::class.java) val updateDataObj = gson.fromJson(updateData, AppUpdateData.Data::class.java)
appUpdateLink = updateDataObj.link appUpdateLink = updateDataObj.link
} }
val s = String.format( val s = String.format(
getString(R.string.share_mod_msg), getString(R.string.share_mod_msg),
title, title,
link + "website/pages/modPage.php?&modId=" + modId, appUpdateLink link + "website/pages/modPage.php?&modId=" + modId, appUpdateLink
) )
AppOperator.shareText(this, getString(R.string.share_mod), s) AppOperator.shareText(this, getString(R.string.share_mod), s)
} }
R.id.update_record -> { R.id.update_record -> {
GlobalMethod.showUpdateLog(this, modId) GlobalMethod.showUpdateLog(this, modId)
} }
@ -215,7 +254,7 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
val numberFormat = NumberFormat.getNumberInstance() val numberFormat = NumberFormat.getNumberInstance()
numberFormat.maximumFractionDigits = 2 numberFormat.maximumFractionDigits = 2
val trueProgress = val trueProgress =
numberFormat.format(bytesRead.toDouble() / contentLength.toDouble() * 100) numberFormat.format(bytesRead.toDouble() / contentLength.toDouble() * 100)
progress = trueProgress.toFloat().toInt() progress = trueProgress.toFloat().toInt()
runOnUiThread { runOnUiThread {
val progressTip = String.format(tip, progress) val progressTip = String.format(tip, progress)
@ -319,12 +358,12 @@ class WebModInfoActivity : BaseActivity<ActivityWebModInfoBinding>() {
*/ */
fun gotoUserPage(userId: String) { fun gotoUserPage(userId: String) {
val intent = Intent( val intent = Intent(
this@WebModInfoActivity, this@WebModInfoActivity,
UserHomePageActivity::class.java UserHomePageActivity::class.java
) )
intent.putExtra("userId", userId) intent.putExtra("userId", userId)
startActivity( startActivity(
intent intent
) )
} }

View File

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

View File

@ -8,7 +8,9 @@ import androidx.fragment.app.Fragment
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.coldmint.rust.pro.R import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.adapters.CommunityAdapter import com.coldmint.rust.pro.adapters.CommunityAdapter
import com.coldmint.rust.pro.tool.Tools
import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationBarView
import com.google.android.material.navigationrail.NavigationRailView
class CommunityFragment : Fragment() { class CommunityFragment : Fragment() {
@ -19,9 +21,6 @@ class CommunityFragment : Fragment() {
if (!isAdded) { if (!isAdded) {
return return
} }
/* else {
viewBinding.pager.postDelayed({ loadTab() }, MainActivity.linkInterval)
}*/
} }
override fun onCreateView( override fun onCreateView(
@ -29,7 +28,6 @@ class CommunityFragment : Fragment() {
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
val inflate = inflater.inflate(R.layout.fragment_community, container, false) val inflate = inflater.inflate(R.layout.fragment_community, container, false)
onViewCreated(inflate) onViewCreated(inflate)
return inflate return inflate
@ -38,6 +36,10 @@ class CommunityFragment : Fragment() {
private fun onViewCreated(view: View) { private fun onViewCreated(view: View) {
val navigationBarView : NavigationBarView = view.findViewById(R.id.bottomnavigationView) val navigationBarView : NavigationBarView = view.findViewById(R.id.bottomnavigationView)
val pager : ViewPager2 = view.findViewById(R.id.pager) val pager : ViewPager2 = view.findViewById(R.id.pager)
if (Tools.isTabletMode(requireContext())) {
// var navigation = navigationBarView as NavigationRailView
// navigation.setonc
}
pager.adapter = CommunityAdapter(this) pager.adapter = CommunityAdapter(this)
pager.isSaveEnabled = false pager.isSaveEnabled = false
pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
@ -76,46 +78,4 @@ class CommunityFragment : Fragment() {
true true
} }
} }
// override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {
// viewBinding.pager.adapter = CommunityAdapter(this)
// viewBinding.pager.isSaveEnabled = false
// viewBinding.pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
// override fun onPageSelected(position: Int) {
// when (position) {
// 0 -> {
// viewBinding.bottomnavigationView.selectedItemId = R.id.action_recommended
// }
// 1 -> {
// viewBinding.bottomnavigationView.selectedItemId = R.id.action_follow
// }
// 2 -> {
// viewBinding.bottomnavigationView.selectedItemId = R.id.action_ranking
// }
// 3 -> {
// viewBinding.bottomnavigationView.selectedItemId = R.id.action_my
// }
// }
// }
// })
// viewBinding.bottomnavigationView.setOnItemSelectedListener {
// when (it.itemId) {
// R.id.action_recommended -> {
// viewBinding.pager.currentItem = 0
// }
// R.id.action_follow -> {
// viewBinding.pager.currentItem = 1
// }
// R.id.action_ranking -> {
// viewBinding.pager.currentItem = 2
// }
// R.id.action_my -> {
// viewBinding.pager.currentItem = 3
// }
// }
// true
// }
//
//
// loadTab()
// }
} }

View File

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

View File

@ -87,7 +87,6 @@ class RankingFragment : BaseFragment<FragmentRankingBinding>() {
private fun loadMods() { private fun loadMods() {
viewBinding.progressBar.isVisible = true viewBinding.progressBar.isVisible = true
viewBinding.textview.isVisible = false viewBinding.textview.isVisible = false
// viewBinding.swipeRefreshLayout.isVisible = false
WebMod.instance.list(object : ApiCallBack<WebModListData> { WebMod.instance.list(object : ApiCallBack<WebModListData> {
override fun onResponse(t: WebModListData) { override fun onResponse(t: WebModListData) {
if (!isAdded) { if (!isAdded) {

View File

@ -3,8 +3,6 @@ package com.coldmint.rust.pro.fragments
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.coldmint.dialog.CoreDialog import com.coldmint.dialog.CoreDialog
@ -28,6 +26,7 @@ import com.youth.banner.adapter.BannerImageAdapter
import com.youth.banner.holder.BannerImageHolder import com.youth.banner.holder.BannerImageHolder
import com.youth.banner.indicator.CircleIndicator import com.youth.banner.indicator.CircleIndicator
class RecommendedFragment : BaseFragment<FragmentRecommendedBinding>() { class RecommendedFragment : BaseFragment<FragmentRecommendedBinding>() {
/** /**
@ -67,32 +66,34 @@ class RecommendedFragment : BaseFragment<FragmentRecommendedBinding>() {
/** /**
* 加载随机推荐 * 加载随机推荐
*/ */
fun loadRandomRecommended() { private fun loadRandomRecommended() {
viewBinding.randomRecommendedProgressIndicator.isVisible = true viewBinding.randomRecommendedProgressIndicator.isVisible = true
WebMod.instance.randomRecommended(6, object : ApiCallBack<WebModListData> { WebMod.instance.randomRecommended(6, object : ApiCallBack<WebModListData> {
override fun onResponse(t: WebModListData) { override fun onResponse(t: WebModListData) {
val data = t.data?.toMutableList() val data = t.data?.toMutableList()
if (data == null || data.isEmpty()) { if (data.isNullOrEmpty()) {
viewBinding.randomRecommendedProgressIndicator.isVisible = false viewBinding.randomRecommendedProgressIndicator.isVisible = false
viewBinding.swipeRefreshLayout.isRefreshing = false
} else { } else {
viewBinding.randomRecommendedProgressIndicator.isVisible = false viewBinding.randomRecommendedProgressIndicator.isVisible = false
viewBinding.randomRecommendedView.isVisible = true viewBinding.randomRecommendedView.isVisible = true
viewBinding.randomRecommendedView.adapter = createAdapter(data) viewBinding.randomRecommendedView.adapter = createAdapter(data)
viewBinding.swipeRefreshLayout.isRefreshing = false
} }
} }
override fun onFailure(e: Exception) { override fun onFailure(e: Exception) {
e.printStackTrace() e.printStackTrace()
viewBinding.randomRecommendedProgressIndicator.isVisible = false viewBinding.randomRecommendedProgressIndicator.isVisible = false
viewBinding.swipeRefreshLayout.isRefreshing = false
} }
}) })
} }
/** /**
* 加载个性化推荐 * 加载个性化推荐
*/ */
fun loadSoleRecommended() { private fun loadSoleRecommended() {
viewBinding.soleRecommendedCardView.isVisible = false viewBinding.soleRecommendedCardView.isVisible = false
viewBinding.soleRecommendedProgressIndicator.isVisible = true viewBinding.soleRecommendedProgressIndicator.isVisible = true
val account = AppSettings.getValue(AppSettings.Setting.Account, "") val account = AppSettings.getValue(AppSettings.Setting.Account, "")
@ -123,17 +124,17 @@ class RecommendedFragment : BaseFragment<FragmentRecommendedBinding>() {
/** /**
* 加载轮播图数据 * 加载轮播图数据
*/ */
fun loadBannerData() { private fun loadBannerData() {
BannerManager.instance.getItems(object : ApiCallBack<BannerItemDataBean> { BannerManager.instance.getItems(object : ApiCallBack<BannerItemDataBean> {
override fun onResponse(t: BannerItemDataBean) { override fun onResponse(t: BannerItemDataBean) {
if (t.code == ServerConfiguration.Success_Code) { if (t.code == ServerConfiguration.Success_Code) {
val dataList = t.data val dataList = t.data
if (dataList != null && dataList.isNotEmpty()) { if (!dataList.isNullOrEmpty()) {
val forever = val forever =
AppSettings.getValue( AppSettings.getValue(
AppSettings.Setting.ExpirationTime, AppSettings.Setting.ExpirationTime,
0.toLong() 0.toLong()
) == (-2).toLong() ) == (-2).toLong()
val textStyleMaker = TextStyleMaker.instance val textStyleMaker = TextStyleMaker.instance
val showList = dataList.filter { val showList = dataList.filter {
var show = true var show = true
@ -145,31 +146,31 @@ class RecommendedFragment : BaseFragment<FragmentRecommendedBinding>() {
show show
} }
viewBinding.banner.setAdapter(object : viewBinding.banner.setAdapter(object :
BannerImageAdapter<BannerItemDataBean.Data>(showList) { BannerImageAdapter<BannerItemDataBean.Data>(showList) {
override fun onBindView( override fun onBindView(
holder: BannerImageHolder?, holder: BannerImageHolder?,
data: BannerItemDataBean.Data?, data: BannerItemDataBean.Data?,
position: Int, position: Int,
size: Int size: Int
) { ) {
if (holder != null && data != null) { if (holder != null && data != null) {
Glide.with(holder.itemView).load(data.picture) Glide.with(holder.itemView).load(data.picture)
.apply(GlobalMethod.getRequestOptions()) .apply(GlobalMethod.getRequestOptions())
.into(holder.imageView) .into(holder.imageView)
holder.imageView.setOnClickListener { holder.imageView.setOnClickListener {
val type = textStyleMaker.getType(data.link) val type = textStyleMaker.getType(data.link)
val linkData = textStyleMaker.getData(data.link) val linkData = textStyleMaker.getData(data.link)
if (type == null || linkData == null) { if (type == null || linkData == null) {
CoreDialog(requireContext()).setTitle(data.title) CoreDialog(requireContext()).setTitle(data.title)
.setMessage(data.link) .setMessage(data.link)
.setPositiveButton(R.string.dialog_ok) { .setPositiveButton(R.string.dialog_ok) {
}.setCancelable(false).show() }.setCancelable(false).show()
} else { } else {
textStyleMaker.clickEvent( textStyleMaker.clickEvent(
requireContext(), requireContext(),
type, type,
linkData linkData
) )
} }
} }
@ -231,11 +232,16 @@ class RecommendedFragment : BaseFragment<FragmentRecommendedBinding>() {
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) { override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {
viewBinding.latestReleaseView.layoutManager = ScrollLinearLayoutManager(requireContext()) viewBinding.latestReleaseView.layoutManager = ScrollLinearLayoutManager(requireContext())
viewBinding.soleRecommendedRecyclerView.layoutManager = viewBinding.soleRecommendedRecyclerView.layoutManager =
ScrollLinearLayoutManager(requireContext()) ScrollLinearLayoutManager(requireContext())
viewBinding.randomRecommendedView.layoutManager = ScrollLinearLayoutManager(requireContext()) viewBinding.randomRecommendedView.layoutManager = ScrollLinearLayoutManager(requireContext())
loadRandomRecommended() loadRandomRecommended()
viewBinding.changeRandomRecommended.setOnClickListener { // 下拉刷新随机推荐的模组
viewBinding.swipeRefreshLayout.setOnRefreshListener {
loadRandomRecommended() loadRandomRecommended()
} }
// 动态设置Banner高度
viewBinding.bannerCardView.layoutParams.height = (resources.displayMetrics.heightPixels / 2.5).toInt()
viewBinding.bannerCardView.requestLayout()
} }
} }

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

@ -15,11 +15,4 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" /> android:layout_weight="1" />
<!-- <com.google.android.material.bottomnavigation.BottomNavigationView-->
<!-- android:id="@+id/bottomnavigationView"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- app:menu="@menu/menu_main_bottom" />-->
</LinearLayout> </LinearLayout>

View File

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

View File

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

View File

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

View File

@ -87,8 +87,7 @@
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:overScrollMode="never" android:overScrollMode="ifContentScrolls" />
android:background="#fff" />
<com.scwang.smart.refresh.footer.ClassicsFooter <com.scwang.smart.refresh.footer.ClassicsFooter
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"/>

View File

@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout 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:card_view="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:animateLayoutChanges="true" android:animateLayoutChanges="true"
android:gravity="center" android:gravity="center"
android:orientation="vertical"> android:orientation="vertical">
<ProgressBar <ProgressBar
android:id="@+id/progressBar" android:id="@+id/progressBar"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -21,142 +22,151 @@
android:text="@string/info" android:text="@string/info"
android:visibility="gone" /> android:visibility="gone" />
<androidx.core.widget.NestedScrollView <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/nestedScrollView" android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp">
android:visibility="visible">
<LinearLayout <androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:visibility="visible">
<com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="200dp"
app:banner_indicator_selected_color="?attr/colorPrimary" />
</com.google.android.material.card.MaterialCardView>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="16dp" android:fillViewport="true"
android:orientation="vertical" android:orientation="vertical">
android:padding="8dp">
<com.google.android.material.card.MaterialCardView
android:id="@+id/bannerCardView"
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="200dp">
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:banner_indicator_selected_color="?attr/colorPrimary" />
</com.google.android.material.card.MaterialCardView>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:gravity="center_vertical"> android:layout_marginTop="16dp"
android:orientation="vertical"
android:padding="8dp">
<TextView <LinearLayout
style="@style/TextAppearance.Material3.HeadlineSmall" android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:gravity="center_vertical">
android:text="@string/random_recommended" />
<Button <TextView
android:id="@+id/changeRandomRecommended" style="@style/TextAppearance.Material3.HeadlineSmall"
style="@style/Widget.Material3.Button.TextButton" android:layout_width="0dp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/random_recommended" />
<!-- <Button-->
<!-- android:id="@+id/changeRandomRecommended"-->
<!-- style="@style/Widget.Material3.Button.TextButton"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:text="@string/change_random_recommended"-->
<!-- card_view:ignore="RelativeOverlap" />-->
</LinearLayout>
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/randomRecommendedProgressIndicator"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/change_random_recommended" android:layout_marginTop="8dp"
card_view:ignore="RelativeOverlap" /> android:indeterminate="true" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/randomRecommendedView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:focusableInTouchMode="false"
android:nestedScrollingEnabled="false"
android:visibility="gone" />
</LinearLayout> </LinearLayout>
<com.google.android.material.progressindicator.LinearProgressIndicator <LinearLayout
android:id="@+id/randomRecommendedProgressIndicator"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_marginTop="8dp" android:layout_marginTop="16dp"
android:indeterminate="true" /> android:orientation="vertical"
android:padding="8dp">
<TextView
style="@style/TextAppearance.Material3.HeadlineSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/latest_release" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/latestReleaseProgressIndicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:indeterminate="true" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/randomRecommendedView" android:id="@+id/latestReleaseView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:focusableInTouchMode="false"
android:nestedScrollingEnabled="false" />
</LinearLayout>
<LinearLayout
android:id="@+id/soleRecommendedCardView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_marginTop="8dp" android:layout_marginTop="16dp"
android:focusableInTouchMode="false" android:orientation="vertical"
android:nestedScrollingEnabled="false" android:padding="8dp">
android:visibility="gone" />
<TextView
style="@style/TextAppearance.Material3.HeadlineSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pay_attention_new" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/soleRecommendedProgressIndicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:indeterminate="true" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/soleRecommendedRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:focusableInTouchMode="false"
android:nestedScrollingEnabled="false" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="16dp"
android:orientation="vertical"
android:padding="8dp">
<TextView
style="@style/TextAppearance.Material3.HeadlineSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/latest_release" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/latestReleaseProgressIndicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:indeterminate="true" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/latestReleaseView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="false"
android:nestedScrollingEnabled="false"
android:layout_marginTop="8dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/soleRecommendedCardView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="16dp"
android:orientation="vertical"
android:padding="8dp">
<TextView
style="@style/TextAppearance.Material3.HeadlineSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pay_attention_new" />
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/soleRecommendedProgressIndicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:indeterminate="true" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/soleRecommendedRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="false"
android:nestedScrollingEnabled="false"
android:layout_marginTop="8dp" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout> </LinearLayout>