Android 实现一个隐私弹窗

效果图如下:

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

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

res/layout/dialog_privacy_policy.xml 文件

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">

    <TextView
        android: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"/>

    <TextView
        android:id="@+id/tvContent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#444444"
        android:textSize="15sp"
        android:lineSpacingExtra="4dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="24dp"
        android:gravity="center">

        <androidx.appcompat.widget.AppCompatButton
            android: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" />

        <View
            android:layout_width="16dp"
            android:layout_height="0dp" />

        <androidx.appcompat.widget.AppCompatButton
            android: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 文件

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文件

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文件

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 文件
Kotlin 复制代码
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.AlertDialog

class 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 + "《用户协议》".length
        val privacyStart = content.indexOf("《隐私政策》")
        val privacyEnd = privacyStart + "《隐私政策》".length

        spannable.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 = spannable
        tvContent.movementMethod = LinkMovementMethod.getInstance()
        tvContent.highlightColor = Color.TRANSPARENT

        val 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

XML 复制代码
package com.example.poemapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AlertDialog

class 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()

    }


}
相关推荐
lichong95121 小时前
Android studio 修改包名
android·java·前端·ide·android studio·大前端·大前端++
爱学习的大牛1231 天前
MVVM 架构 android
android·mvvm
alexhilton1 天前
理解retain{}的内部机制:Jetpack Compose中基于作用域的状态保存
android·kotlin·android jetpack
꒰ঌ 安卓开发໒꒱1 天前
Mysql 坏表修复
android·mysql·adb
_李小白1 天前
【Android Gradle学习笔记】第八天:NDK的使用
android·笔记·学习
袁震1 天前
Android-Compose 列表组件详解
android·recyclerview·compose
2501_916007471 天前
提升 iOS 26 系统流畅度的实战指南,多工具组合监控
android·macos·ios·小程序·uni-app·cocoa·iphone
zh_xuan1 天前
android 利用反射和注解绑定控件id和点击事件
android·注解·反射·控件绑定
这个杀手不太累1 天前
Android ProcessLifecycleOwner
android·lifecycle
SRC_BLUE_171 天前
NSSCTF - Web | 【第五空间 2021】pklovecloud
android·前端