From f980c833f832c42094cf78005aab5d0eb014c8ec Mon Sep 17 00:00:00 2001
From: zhujie <leon.zhu@cloudroam.com.cn>
Date: 星期五, 18 四月 2025 15:23:58 +0800
Subject: [PATCH] 邀请有礼
---
app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt | 6
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 2
app/src/main/res/drawable/table_border.xml | 7
app/src/main/res/xml/file_paths.xml | 5
app/src/main/res/layout/activity_invitation_main.xml | 289 ++++++++++++++-----------
app/src/main/AndroidManifest.xml | 9
app/src/main/res/xml/network_security_config.xml | 1
app/src/main/java/com/example/firstapp/database/service/ApiService.kt | 9
app/src/main/res/drawable/table_cell_border.xml | 4
app/src/main/res/layout/dialog_image_preview.xml | 24 ++
app/src/main/res/drawable/invite.png | 0
app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt | 250 +++++++++++++++-------
12 files changed, 396 insertions(+), 210 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4004bcd..a5aca2e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -158,6 +158,15 @@
android:name=".activity.ReminderSettingsActivity"
android:exported="false"
android:label="设置提醒" />
+ <provider
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="${applicationId}.fileprovider"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/file_paths" />
+ </provider>
</application>
</manifest>
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt
index 989348b..68a299b 100644
--- a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt
+++ b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt
@@ -14,6 +14,8 @@
import com.example.firstapp.database.response.LoginResponse
import com.example.firstapp.database.response.SecurityResponse
import com.example.firstapp.database.response.UserInfo
+import com.example.firstapp.entity.InvitationRecord
+import com.example.firstapp.entity.InvitationRecords
import com.example.firstapp.model.CategoryConfig
import com.example.firstapp.model.CategoryConfigSync
import com.example.firstapp.network.AuthInterceptor
@@ -81,13 +83,16 @@
@POST("api/categoryConfig/saveOrUpdate/")
suspend fun saveUserCategories(@Body categoryConfigSync: CategoryConfigSync)
+ @GET("api/customer/center/invitereward")
+ suspend fun getInvitereward(): ApiResponse<InvitationRecords>
+
}
// 创建Retrofit实例(单例)
object RetrofitClient{
- // private const val BASE_URL ="http://192.168.1.213:8080/flower/"
- private const val BASE_URL ="http://14.103.144.28:8080/flower/"
+ private const val BASE_URL ="http://192.168.1.127:8080/flower/"
+ //private const val BASE_URL ="http://14.103.144.28:8080/flower/"
private lateinit var appContext: Context
diff --git a/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
index d131854..eb514c9 100644
--- a/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
+++ b/app/src/main/java/com/example/firstapp/entity/InvitationRecord.kt
@@ -1,7 +1,13 @@
package com.example.firstapp.entity
data class InvitationRecord(
+ val userId: String,
val userName: String,
val reward: String,
val status: String
+)
+
+data class InvitationRecords(
+ val successInvite: List<InvitationRecord>,
+ val myInvite: List<InvitationRecord>
)
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
index 353707d..2bc9633 100644
--- a/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
+++ b/app/src/main/java/com/example/firstapp/ui/invitation/InvitationActivity.kt
@@ -1,9 +1,14 @@
package com.example.firstapp.ui.invitation
+import android.app.Dialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
+import android.graphics.Bitmap
+import android.graphics.Color
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Bundle
import android.os.Handler
@@ -11,18 +16,32 @@
import android.text.Html
import android.util.TypedValue
import android.view.View
+import android.view.ViewGroup
import android.widget.Button
+import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.content.FileProvider
+import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.RecyclerView
+import com.example.firstapp.App.Companion.context
import com.example.firstapp.R
import com.example.firstapp.adapter.InvitationAdapter
import com.example.firstapp.adapter.InvitationRecordAdapter
+import com.example.firstapp.database.request.SmsLoginRequest
+import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.entity.InvitationRecord
+import com.example.firstapp.utils.Log
import com.example.firstapp.utils.PreferencesManager
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.io.File
+import java.io.FileOutputStream
import kotlin.math.abs
class InvitationActivity : AppCompatActivity() {
@@ -31,8 +50,8 @@
private lateinit var recyclerRecordView: RecyclerView
private lateinit var adapter: InvitationAdapter
private lateinit var recordadapter: InvitationRecordAdapter
- private val data = mutableListOf<InvitationRecord>()
- private val recorddata = mutableListOf<InvitationRecord>()
+ private var data = mutableListOf<InvitationRecord>()
+ private var recorddata = mutableListOf<InvitationRecord>()
private val handler = Handler(Looper.getMainLooper())
private val scrollInterval = 3000L
private var currentScrollPosition = 0
@@ -52,9 +71,10 @@
initRecorddapter()
//加载数据
- loadData()
+ getInvitereward()
+ //loadData()
- loadRecordData()
+ //loadRecordData()
//启动轮播
startAutoScroll()
@@ -62,13 +82,13 @@
//分享
val btnInvite = findViewById<Button>(R.id.btnInvite)
btnInvite.setOnClickListener {
- shareImageToWechat()
+ showImagePreviewDialog()
}
//邀请码
val invitationCodeText = findViewById<TextView>(R.id.invitationCodeText)
- invitationCodeText.text = "A1B2"
- //invitationCodeText.text = formatInvitationCode(PreferencesManager.getInviteCode());
+ //invitationCodeText.text = "A1B2"
+ invitationCodeText.text = formatInvitationCode(PreferencesManager.getInviteCode());
findViewById<Button>(R.id.copyButton).setOnClickListener {
val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText(
@@ -207,52 +227,132 @@
recyclerRecordView.adapter = recordadapter
}
- private fun loadData() {
- data.clear()
- data.addAll(
- listOf(
- InvitationRecord("H****e", "获得了1天会员", "已注册"),
- InvitationRecord("U****r", "获得了2天会员", "已注册"),
- InvitationRecord("A****e", "获得了免广告特权", "已注册"),
- InvitationRecord("B****e", "获得了3天会员", "已注册"),
- InvitationRecord("C****o", "获得了4天会员", "已注册")
- )
- )
- adapter.notifyDataSetChanged()
+ private fun getInvitereward() {
+ lifecycleScope.launch {
+ try {
+ val response = RetrofitClient.apiService.getInvitereward()
+ if (response.code == "0") {
+ response.data?.let { records ->
+ // 正确更新现有列表(保持原有引用)
+ data.apply {
+ clear()
+ addAll(records.successInvite ?: emptyList())
+ }
+
+ recorddata.apply {
+ clear()
+ addAll(records.myInvite ?: emptyList()) // 注意这里使用myInvite
+ }
+
+ // 在UI线程更新适配器
+ withContext(Dispatchers.Main) {
+ adapter.notifyDataSetChanged()
+ recordadapter.notifyDataSetChanged()
+ }
+ } ?: run {
+ Log.w("API", "Response data is null")
+ }
+ } else {
+ Log.w("API", "Server error: ${response.msg}")
+ }
+ } catch (e: Exception) {
+ Log.e("getinviterewardError", "message: ${e.message}", e)
+ withContext(Dispatchers.Main) {
+ Toast.makeText(context, "请求失败: ${e.message}", Toast.LENGTH_SHORT).show()
+ }
+ }
+ }
}
- private fun loadRecordData() {
- recorddata.clear()
- recorddata.addAll(
- listOf(
- InvitationRecord("M****e", "", "未注册"),
- InvitationRecord("Q****r", "", "已注册"),
- InvitationRecord("W****e", "", "未注册"),
- InvitationRecord("E****e", "", "未注册"),
- InvitationRecord("R****o", "", "已注册")
- )
- )
- recordadapter.notifyDataSetChanged()
+// private fun loadData() {
+// data.clear()
+// data.addAll(
+// listOf(
+// InvitationRecord("H****e", "获得了1天会员", "已注册"),
+// InvitationRecord("U****r", "获得了2天会员", "已注册"),
+// InvitationRecord("A****e", "获得了免广告特权", "已注册"),
+// InvitationRecord("B****e", "获得了3天会员", "已注册"),
+// InvitationRecord("C****o", "获得了4天会员", "已注册")
+// )
+// )
+// adapter.notifyDataSetChanged()
+// }
+
+// private fun loadRecordData() {
+// recorddata.clear()
+// recorddata.addAll(
+// listOf(
+// InvitationRecord("M****e", "", "未注册"),
+// InvitationRecord("Q****r", "", "已注册"),
+// InvitationRecord("W****e", "", "未注册"),
+// InvitationRecord("E****e", "", "未注册"),
+// InvitationRecord("R****o", "", "已注册")
+// )
+// )
+// recordadapter.notifyDataSetChanged()
+// }
+
+ private fun showImagePreviewDialog() {
+ val dialog = Dialog(this, android.R.style.Theme_Translucent_NoTitleBar).apply {
+ // 设置全屏+透明背景
+ window?.apply {
+ setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
+ setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+ }
+
+ setContentView(R.layout.dialog_image_preview)
+ setCancelable(true) // 点击空白处可关闭
+
+ val imageView = findViewById<ImageView>(R.id.ivPreview)
+
+ // 长按分享(不关闭对话框)
+ imageView.setOnLongClickListener {
+ shareImageToWechat()
+ true
+ }
+
+ // 点击图片关闭(可选)
+ imageView.setOnClickListener {
+ dismiss()
+ }
+ }
+
+ dialog.show()
}
+
// 分享资源图片到微信
private fun shareImageToWechat() {
try {
- // 获取资源图片的URI
- val imageUri = Uri.parse("android.resource://${packageName}/${R.drawable.location}")
+ // 1. 将 drawable 图片保存到缓存目录
+ val drawable = ContextCompat.getDrawable(this, R.drawable.invite)!!
+ val bitmap = (drawable as BitmapDrawable).bitmap
+ // 2. 创建临时图片文件
+ val cacheDir = File(cacheDir, "shared_images").apply { mkdirs() }
+ val imageFile = File(cacheDir, "invite.jpg") // 指定文件名
+ FileOutputStream(imageFile).use { out ->
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)
+ }
+
+ // 3. 使用 FileProvider 获取 URI
+ val imageUri = FileProvider.getUriForFile(
+ this,
+ "${packageName}.fileprovider",
+ imageFile
+ )
+
+ // 4. 创建分享 Intent
val intent = Intent().apply {
action = Intent.ACTION_SEND
- type = "image/*"
+ type = "image/jpeg"
putExtra(Intent.EXTRA_STREAM, imageUri)
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
setPackage("com.tencent.mm") // 指定微信包名
}
- // 创建选择器,即使微信不可用也能选择其他应用
+ // 5. 启动分享选择器
val chooserIntent = Intent.createChooser(intent, "分享邀请图片")
-
- // 检查是否有应用能处理这个Intent
if (intent.resolveActivity(packageManager) != null) {
startActivity(chooserIntent)
} else {
@@ -264,8 +364,8 @@
}
private fun formatInvitationCode(code: String): String {
- return if (code.length > 2) {
- code.chunked(2).joinToString(" ")
+ return if (code.length > 1) {
+ code.chunked(1).joinToString(" ")
} else {
code
}
@@ -280,7 +380,7 @@
// 使用取模运算确保位置在有效范围内
currentScrollPosition++
- currentRecordScrollPosition++
+ //currentRecordScrollPosition++
// 创建自定义平滑滚动器
val smoothScroller = object : LinearSmoothScroller(this@InvitationActivity) {
@@ -305,32 +405,32 @@
targetPosition = currentScrollPosition
}
- val smoothRecordScroller = object : LinearSmoothScroller(this@InvitationActivity) {
- override fun getVerticalSnapPreference(): Int = SNAP_TO_START
-
- override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int {
- // 计算需要滚动的距离,确保完整显示下一个item
- val top = view.top
- val height = view.height
- return when {
- snapPreference == SNAP_TO_START -> -top
- snapPreference == SNAP_TO_END -> -(top - (recyclerRecordView.height - height))
- else -> -(top - (recyclerRecordView.height / 2 - height / 2))
- }
- }
-
- override fun calculateTimeForScrolling(dx: Int): Int {
- // 根据滚动距离动态计算时间,保持匀速
- return maxOf((500f * abs(dx) / itemHeight).toInt(), 200)
- }
- }.apply {
- targetPosition = currentRecordScrollPosition
- }
+// val smoothRecordScroller = object : LinearSmoothScroller(this@InvitationActivity) {
+// override fun getVerticalSnapPreference(): Int = SNAP_TO_START
+//
+// override fun calculateDyToMakeVisible(view: View, snapPreference: Int): Int {
+// // 计算需要滚动的距离,确保完整显示下一个item
+// val top = view.top
+// val height = view.height
+// return when {
+// snapPreference == SNAP_TO_START -> -top
+// snapPreference == SNAP_TO_END -> -(top - (recyclerRecordView.height - height))
+// else -> -(top - (recyclerRecordView.height / 2 - height / 2))
+// }
+// }
+//
+// override fun calculateTimeForScrolling(dx: Int): Int {
+// // 根据滚动距离动态计算时间,保持匀速
+// return maxOf((500f * abs(dx) / itemHeight).toInt(), 200)
+// }
+// }.apply {
+// targetPosition = currentRecordScrollPosition
+// }
// 启动平滑滚动
recyclerSuccessView.layoutManager?.startSmoothScroll(smoothScroller)
- recyclerRecordView.layoutManager?.startSmoothScroll(smoothRecordScroller)
+ //recyclerRecordView.layoutManager?.startSmoothScroll(smoothRecordScroller)
// 更智能的边界检测
(recyclerSuccessView.layoutManager as? LinearLayoutManager)?.let { lm ->
@@ -345,24 +445,20 @@
}
}
- (recyclerRecordView.layoutManager as? LinearLayoutManager)?.let { lm ->
- val lastVisible = lm.findLastVisibleItemPosition()
- val totalItems = recordadapter.itemCount
-
- // 当接近"虚拟列表"末尾时,跳转到中间位置
- if (lastVisible >= totalItems - 3) {
- val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems)
- currentRecordScrollPosition = jumpPosition
- recyclerRecordView.scrollToPosition(jumpPosition)
- }
- }
+// (recyclerRecordView.layoutManager as? LinearLayoutManager)?.let { lm ->
+// val lastVisible = lm.findLastVisibleItemPosition()
+// val totalItems = recordadapter.itemCount
+//
+// // 当接近"虚拟列表"末尾时,跳转到中间位置
+// if (lastVisible >= totalItems - 3) {
+// val jumpPosition = (totalItems / 2) * (Int.MAX_VALUE / totalItems)
+// currentRecordScrollPosition = jumpPosition
+// recyclerRecordView.scrollToPosition(jumpPosition)
+// }
+// }
handler.postDelayed(this, scrollInterval)
}
- }
-
- private fun pxToDp(px: Int, context: Context): Int {
- return (px / (context.resources.displayMetrics.density)).toInt()
}
private fun dpToPx(dp: Float): Int {
diff --git a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
index 09bd8da..1d26709 100644
--- a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
+++ b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
@@ -327,7 +327,7 @@
val userInfo = response.data
// 本地保存我的邀请码
-// PreferencesManager.setInviteCode(userInfo.intervialcode);
+ PreferencesManager.setInviteCode(userInfo.intervialcode);
// 设置头像
Glide.with(this)
.load(userInfo.cover)
diff --git a/app/src/main/res/drawable/invite.png b/app/src/main/res/drawable/invite.png
new file mode 100644
index 0000000..80eab74
--- /dev/null
+++ b/app/src/main/res/drawable/invite.png
Binary files differ
diff --git a/app/src/main/res/drawable/table_border.xml b/app/src/main/res/drawable/table_border.xml
index af40445..61fed64 100644
--- a/app/src/main/res/drawable/table_border.xml
+++ b/app/src/main/res/drawable/table_border.xml
@@ -1,7 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <stroke
- android:width="1dp"
- android:color="#CCCCCC" />
- <solid android:color="#FFFFFF" />
+ <stroke android:width="1dp" android:color="#DDDDDD"/>
+ <corners android:radius="4dp"/>
</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/table_cell_border.xml b/app/src/main/res/drawable/table_cell_border.xml
new file mode 100644
index 0000000..e589ce8
--- /dev/null
+++ b/app/src/main/res/drawable/table_cell_border.xml
@@ -0,0 +1,4 @@
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <stroke android:width="0.5dp" android:color="#DDDDDD"/>
+ <padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="1dp"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_invitation_main.xml b/app/src/main/res/layout/activity_invitation_main.xml
index 88a6273..40b98d9 100644
--- a/app/src/main/res/layout/activity_invitation_main.xml
+++ b/app/src/main/res/layout/activity_invitation_main.xml
@@ -63,7 +63,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
- app:cardCornerRadius="18dp">
+ app:cardCornerRadius="38dp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/invitationsuccessRecyclerView"
@@ -93,39 +93,40 @@
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="8dp"
+ app:cardBackgroundColor="#FFFFFF"
app:cardCornerRadius="8dp"
- app:cardPreventCornerOverlap="true"
app:cardElevation="0dp"
- app:cardBackgroundColor="#FFFFFF">
+ app:cardPreventCornerOverlap="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="16dp"
- android:paddingEnd="16dp"
- android:gravity="center_vertical">
+ android:paddingEnd="16dp">
<TextView
android:id="@+id/invitationCodeText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:text="A1B2"
android:textAlignment="center"
android:textColor="#000000"
android:textSize="30sp" />
<Button
android:id="@+id/copyButton"
+ style="?android:attr/borderlessButtonStyle"
android:layout_width="wrap_content"
android:layout_height="40dp"
- android:text="复制邀请码"
- android:textColor="#FF0000"
- android:backgroundTint="#FFFFFF"
- android:textSize="12sp"
+ android:background="@android:color/transparent"
android:paddingStart="12dp"
- android:paddingEnd="12dp"/>
+ android:paddingEnd="12dp"
+ android:stateListAnimator="@null"
+ android:text="复制邀请码"
+ android:textColor="#FF0000FF"
+ android:textSize="13sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
@@ -137,136 +138,155 @@
app:cardCornerRadius="6dp"
app:cardPreventCornerOverlap="true">
- <TableLayout
- android:id="@+id/tableLayout"
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/table_border"
- android:shrinkColumns="*"
- android:stretchColumns="*">
+ android:orientation="vertical">
- <TableRow>
+ <!-- 添加"邀请任务"标题 -->
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="16dp"
+ android:paddingBottom="8dp"
+ android:text="邀请任务"
+ android:textColor="#333333"
+ android:textSize="16sp"
+ android:textStyle="bold" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="邀请人数"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
+ <!-- 表格区域 -->
+ <TableLayout
+ android:id="@+id/tableLayout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_border"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:paddingBottom="16dp"
+ android:shrinkColumns="*"
+ android:stretchColumns="*">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="邀请奖励"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
+ <TableRow android:background="@drawable/table_cell_border">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="被邀请人奖励"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
- </TableRow>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="邀请人数"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
- <TableRow>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="邀请奖励"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="1人"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="被邀请人奖励"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
+ </TableRow>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="3天会员"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
+ <TableRow android:background="@drawable/table_cell_border">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="1天会员"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
- </TableRow>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="1人"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
- <TableRow>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="3天会员"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="3人"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="1天会员"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
+ </TableRow>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="15天会员"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
+ <TableRow android:background="@drawable/table_cell_border">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="1天会员"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
- </TableRow>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="3人"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
- <TableRow>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="15天会员"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="5人"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="1天会员"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
+ </TableRow>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="30天会员"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
+ <TableRow android:background="@drawable/table_cell_border">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="6dp"
- android:text="1天会员"
- android:textAlignment="center"
- android:textColor="#333333"
- android:textSize="12sp" />
- </TableRow>
- </TableLayout>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="5人"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="30天会员"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/table_cell_border"
+ android:text="1天会员"
+ android:textAlignment="center"
+ android:textColor="#333333"
+ android:textSize="12sp" />
+ </TableRow>
+ </TableLayout>
+ </LinearLayout>
</androidx.cardview.widget.CardView>
<!-- 邀请记录区域 -->
@@ -276,12 +296,31 @@
android:layout_marginBottom="20dp"
app:cardCornerRadius="6dp"
app:cardPreventCornerOverlap="true">
- <androidx.recyclerview.widget.RecyclerView
- android:id="@+id/invitationrecordRecyclerView"
+
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:nestedScrollingEnabled="false"
- android:overScrollMode="never" />
+ android:orientation="vertical">
+
+ <!-- 添加"我的邀请记录"标题 -->
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="16dp"
+ android:paddingBottom="8dp"
+ android:text="我的邀请记录"
+ android:textColor="#333333"
+ android:textSize="16sp"
+ android:textStyle="bold"
+ android:gravity="center" />
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/invitationrecordRecyclerView"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:nestedScrollingEnabled="false"
+ android:overScrollMode="never" />
+ </LinearLayout>
</androidx.cardview.widget.CardView>
<!-- 添加一个权重为1的View,用于填充剩余空间 -->
diff --git a/app/src/main/res/layout/dialog_image_preview.xml b/app/src/main/res/layout/dialog_image_preview.xml
new file mode 100644
index 0000000..dd911f6
--- /dev/null
+++ b/app/src/main/res/layout/dialog_image_preview.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#80000000">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <ImageView
+ android:id="@+id/ivPreview"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:adjustViewBounds="true"
+ android:maxWidth="1000dp"
+ android:maxHeight="1000dp"
+ android:scaleType="fitCenter"
+ android:src="@drawable/invite" />
+ </LinearLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml
new file mode 100644
index 0000000..a5d2e93
--- /dev/null
+++ b/app/src/main/res/xml/file_paths.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths>
+ <!-- 缓存目录 -->
+ <cache-path name="shared_images" path="shared_images/" />
+</paths>
\ No newline at end of file
diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml
index ba135d2..bac7af5 100644
--- a/app/src/main/res/xml/network_security_config.xml
+++ b/app/src/main/res/xml/network_security_config.xml
@@ -7,6 +7,7 @@
<domain includeSubdomains="true">192.168.1.199</domain>
<domain includeSubdomains="true">192.168.1.201</domain>
<domain includeSubdomains="true">14.103.144.28</domain>
+ <domain includeSubdomains="true">192.168.1.127</domain>
<!-- 可添加其他域名或IP(如192.168.0.101) -->
<!-- 如果本地服务使用自签名证书,需在 network_security_config.xml 中信任该证书:-->
<!-- <trust-anchors>-->
--
Gitblit v1.9.3