当前位置: 首页 > news >正文

Android 实现一个隐私弹窗

效果图如下:

1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数

2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来

res/layout/dialog_privacy_policy.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/dialogRoot"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/bg_dialog_rounded"android:orientation="vertical"android:padding="24dp"><TextViewandroid:id="@+id/tvTitle"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="用户协议和隐私政策"android:textColor="#222222"android:textSize="18sp"android:textStyle="bold"android:gravity="center"android:layout_marginBottom="16dp"/><TextViewandroid:id="@+id/tvContent"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#444444"android:textSize="15sp"android:lineSpacingExtra="4dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginTop="24dp"android:gravity="center"><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/btnExit"android:layout_width="0dp"android:layout_height="48dp"android:layout_weight="1"android:text="退出应用"android:textColor="#5E5C3F"android:background="@drawable/bg_button_outline"android:textSize="16sp" /><Viewandroid:layout_width="16dp"android:layout_height="0dp" /><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/btnAgree"android:layout_width="0dp"android:layout_height="48dp"android:layout_weight="1.5"android:text="已阅读并同意"android:textColor="#FFFFFF"android:background="@drawable/bg_button_primary"android:textSize="16sp" /></LinearLayout>
</LinearLayout>

res/drawable/bg_dialog_rounded.xml 文件

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#FFFFFF"/><corners android:radius="14dp"/>
</shape>

res/drawable/bg_button_outline.xml文件

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#FFFFFF" /><stroke android:width="0.5dp" android:color="#5E5C3F" /><corners android:radius="8dp" />
</shape>

res/drawable/bg_button_primary.xml文件

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#5E5C3F" /><corners android:radius="8dp" />
</shape>

PrivacyPolicyDialog.kt 文件
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.text.SpannableString
import android.text.Spanned
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.view.LayoutInflater
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AlertDialogclass PrivacyPolicyDialog(private val context: Context,private val onAgree: () -> Unit,private val onExit: () -> Unit,private val onClickUserAgreement: () -> Unit,private val onClickPrivacyPolicy: () -> Unit
) {fun show() {val view = LayoutInflater.from(context).inflate(R.layout.dialog_privacy_policy, null)val tvContent = view.findViewById<TextView>(R.id.tvContent)val tvTitle = view.findViewById<TextView>(R.id.tvTitle)val btnAgree = view.findViewById<Button>(R.id.btnAgree)val btnExit = view.findViewById<Button>(R.id.btnExit)val content = "在您使用本应用之前,请您务必审慎阅读、充分理解“用户协议”和“隐私政策”各条款内容。详细资料请阅读:《用户协议》和《隐私政策》。"val spannable = SpannableString(content)val userStart = content.indexOf("《用户协议》")val userEnd = userStart + "《用户协议》".lengthval privacyStart = content.indexOf("《隐私政策》")val privacyEnd = privacyStart + "《隐私政策》".lengthspannable.setSpan(object : ClickableSpan() {override fun onClick(widget: View) {onClickUserAgreement()}}, userStart, userEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)spannable.setSpan(object : ClickableSpan() {override fun onClick(widget: View) {onClickPrivacyPolicy()}}, privacyStart, privacyEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)tvContent.text = spannabletvContent.movementMethod = LinkMovementMethod.getInstance()tvContent.highlightColor = Color.TRANSPARENTval dialog = AlertDialog.Builder(context).setView(view).setCancelable(false).create()dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))btnAgree.setOnClickListener {onAgree()dialog.dismiss()}btnExit.setOnClickListener {onExit()dialog.dismiss()}dialog.show()}
}

MainActivity.kt
 

package com.example.poemappimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AlertDialogclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)PrivacyPolicyDialog(context = this,onAgree = {Toast.makeText(this, "用户已同意", Toast.LENGTH_SHORT).show()// TODO: 记录已同意状态},onExit = {finish()},onClickUserAgreement = {// TODO: 跳转用户协议页面},onClickPrivacyPolicy = {// TODO: 跳转隐私政策页面}).show()}}

http://www.xdnf.cn/news/205039.html

相关文章:

  • GitHub Actions 自动化部署 Azure Container App 全流程指南
  • 257. 二叉树的所有路径
  • 【Linux】Linux内核模块开发
  • 深入蜂窝物联网 第四章 Cat-1 与 5G RedCap:带宽、低时延与未来趋势
  • redis 有序集合zrange和zrangebyscore的区别
  • Android ndk 编译opencv后部分接口std::__ndk1与项目std::__1不匹配
  • 【LeetCode 热题 100】矩阵置零 / 螺旋矩阵 / 旋转图像 / 搜索二维矩阵 II
  • 【Vagrant+VirtualBox创建自动化虚拟环境】Ansible测试Playbook
  • springboot 框架把 resources下的zip压缩包, springboot 项目启动后解压到项目根目录工具类
  • DeepSeek主动学习系统:低质量数据炼金术的工程化实践
  • runpod team 怎么设置自己的ssh key呢?
  • LLamaFactory如何在Windows系统下部署安装训练(保姆级教程)
  • 松下机器人快速入门指南(2025年更新版)
  • Kotlin-高阶函数,Lambda表达式,内联函数
  • IntelliJ IDEA 2024.3.1 for Mac 中文 Java开发工具
  • 狼人杀中的智能策略:解析AI如何理解复杂社交游戏
  • 语音合成之十韵律之美:TTS如何模拟语音的节奏和语调
  • 23种设计模式-行为型模式之中介者模式(Java版本)
  • 第10次:电商项目配置开发环境
  • 初探RAG
  • SQLyog中DELIMITER执行存储过程时出现的前置缩进问题
  • 在 Windows 的终端安装并使用 azd 命令
  • Windows权限与icacls命令详解
  • taro小程序如何实现大文件(视频、图片)后台下载功能?
  • 小结: 接口类型和路由优先级
  • 如何用python脚本把一个表格有4万多条数据分为两个文件表,每个2万条数据?
  • stm32wb55rg (4) 启用usart串口
  • PDM是什么?PDM有什么用?怎么选PDM?2025制造PDM/PLM系统盘点(4000字)
  • 针对信息过载问题的解决方案
  • 【Prometheus-MySQL Exporter安装配置指南,开机自启】