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