[Andrioid开发] Splash界面/用户协议与隐私政策弹窗/界面开发

[Andrioid开发] Splash界面/用户协议与隐私政策弹窗/界面开发

启动页界面开发、首次启动时的启动页用户协议与隐私政策弹窗,只要不点击同意每次打开都会显示弹窗,同意后立即跳转到主界面,当下次再进入软件就是两秒后自动跳转到主界面。

实现方法一:

效果图

在这里插入图片描述

SplashActivity.java

创建SplashActivity界面

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Paint;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

@SuppressLint("CustomSplashScreen")
public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        isFirstStart();
    }

    /**
     * 判断是否是首次启动
     */
    public void isFirstStart() {
        SharedPreferences preferences = getSharedPreferences("NB_FIRST_START", 0);
        boolean isFirst = preferences.getBoolean("FIRST_START", true);
        if (isFirst) {// 第一次
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            //获取界面
            View view = LayoutInflater.from(this).inflate(R.layout.dialog_privacy_show, null);
            //将界面填充到AlertDiaLog容器并去除边框
            builder.setView(view);
            //取消点击外部消失弹窗
            builder.setCancelable(false);
            //创建AlertDiaLog
            builder.create();
            //AlertDiaLog显示
            AlertDialog dialog = builder.show();
            // 移除dialog的decorview背景色
            dialog.getWindow().getDecorView().setBackground(null);
            //初始化控件
            TextView but_ok = view.findViewById(R.id.but_ok);
            TextView but_return = view.findViewById(R.id.but_return);

            TextView YongHu = view.findViewById(R.id.YongHu);
            YongHu.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线
            YongHu.getPaint().setAntiAlias(true);//抗锯齿
            TextView YinSi = view.findViewById(R.id.YinSi);
            YinSi.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线
            YinSi.getPaint().setAntiAlias(true);//抗锯齿
            //同意按钮
            but_ok.setOnClickListener(view1 -> {
                preferences.edit().putBoolean("FIRST_START", false).apply();
                dialog.dismiss();
                startActivity(new Intent(SplashActivity.this, MainActivity.class));
                finish();
            });

            //取消按钮
            but_return.setOnClickListener(view1 -> {
                dialog.dismiss();
                finish();
            });

            //用户协议
            YongHu.setOnClickListener(view1 -> {
                startActivity(new Intent(this, ProtocolActivity.class));
            });

            //隐私政策
            YinSi.setOnClickListener(view1 -> {
                startActivity(new Intent(this, PrivacyActivity.class));
            });
        } else {
            preferences.edit().putBoolean("FIRST_START", false).apply();
            Handler handler = new Handler();
            handler.postDelayed(() -> {
                startActivity(new Intent(SplashActivity.this, MainActivity.class));
                finish();
            }, 2000);
        }
    }

    //拦截返回键事件
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

}

dialog_privacy_show.xml

更改activity_aplash.xml名字为dialog_privacy_show.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/fill_stroke"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:paddingTop="15dp"
            android:text="温馨提示"
            android:textColor="#FF008b8b"
            android:textSize="18sp"
            android:textStyle="bold" />
    </LinearLayout>

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:paddingTop="10dp"
        android:paddingBottom="5dp"
        android:text="欢迎您使用某某某APP,根据《个人信息安全规范》的要求,尊重并保护用户个人隐私安全,请您在使用前仔细阅读下方的《用户协议》和《隐私政策》条款,同意后开启我们的服务。"
        android:textColor="#5C5C5C"
        android:textSize="16sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:paddingBottom="5dp">

        <TextView
            android:id="@+id/YongHu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用户协议"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#FF008b8b" />

        <View
            android:layout_width="30dp"
            android:layout_height="match_parent" />

        <TextView
            android:id="@+id/YinSi"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="隐私政策"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#FF008b8b" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#eee" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/but_return"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:paddingTop="15dp"
            android:paddingBottom="15dp"
            android:text="取消"
            android:textColor="#999"
            android:textSize="16sp" />

        <LinearLayout
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="#eee" />

        <TextView
            android:id="@+id/but_ok"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:paddingTop="15dp"
            android:paddingBottom="15dp"
            android:text="同意"
            android:textColor="#FF008b8b"
            android:textSize="16sp"
            android:textStyle="bold" />
    </LinearLayout>
</LinearLayout>

AndroidManifest.xml

    <!-- 拥有完全的网络访问权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 修改或删除您的USB存储设备中的内容 -->
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 查看网络连接 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:requestLegacyExternalStorage="true"
        android:usesCleartextTraffic="true"
        tools:targetApi="m">
        <activity
            android:name=".SplashActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:exported="true"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="false" />
    	<activity
            android:name=".PrivacyActivity"
            android:exported="false" />
        <activity
            android:name=".ProtocolActivity"
            android:exported="false" />
    </application>

values/themes.xml

在此themes文件中新增Splash界面的主题,添加splash.png图片,如下:

<style name="SplashTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowBackground">@drawable/splash</item>
        <item name="windowNoTitle">true</item>
</style>

drawable/fill_stroke.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <!--描边设置-->
    <stroke android:color="@android:color/darker_gray"
        android:width="1px" />

    <!--填充设置-->
    <solid android:color="@android:color/white"/>

    <!--圆角设置-->
    <corners android:radius="15dp"/>

</shape>

src/main/assets

创建assets文件夹并在文件夹内创建两个文件分别是:user_agreement.html
privacy_policy.html

user_agreement.html

<!--用户协议-->
<string name="user_agreement">
    <h3>用户内容</h3>
    <p>1.用户内容是指该用户下载、发布或以其他方式使用本产品时产生的所有内容(例如:您的信息、图片、音乐或其他内容)。
        <br/>2.您是您的用户内容唯一的责任人,您将承担因您的用户内容披露而导致的您或任何第三方被识别的风险。
        <br/>3.您已同意您的用户内容受到权利限制(详见“权利限制”)
    </p>

    <h3>修改和终止</h3>
    <h3>修改</h3>
    <p>本协议容许变更。如果本协议有任何实质性变更,我们将通过电子邮件来通知您。变更通知之后,继续使用本产品则为您已知晓此类变更并同意条款约束;
        <br/>我们保留在任何时候无需通知而修改、保留或关闭本产品任何服务之权利;
        <br/>您已同意我们无需因修改、保留或关闭本产品任何服务之权利;
        <br/>您已同意我们无需因修改、保留或关闭本产品任何服务的行为对您或第三方承担责任。
    </p>

    <h3>赔偿</h3>
    <p>您已同意无害地使用本产品,避免因下述行为或相关行为遭受来第三方的任何投诉、诉讼、损失、损害、责任、成本和费用(包括律师费):
        <br/>1.用户使用本产品的行为;
        <br/>2.用户的用户内容;
        <br/>3.用户违反本协议的行为。
    </p>
    <p>我们保留专属抗辩权和请求赔偿的权利
    </p>
    <p>您已同意,除非获得我们书面同意,您不得在您与我们共同对第三方提起的诉讼中单方和解。
    </p>
    <p>我们将尽合理努力将此类诉讼、诉讼行为或进程通知您。
    </p>
    <p>
        在任何情况下,本产品都不对您或任何第三方因本协议产生的任何间接性、后果性、惩罚性的、偶然的、特殊或惩罚性的损害赔偿承担责任。访问、使用本产品所产生的损坏计算机系统或移动通讯设备数据的风险将由您个人承担。
    </p>

    <h3>适用法律</h3>
    <p>本协议适用中华人民共和国法律;
        <br/>如果双方发生纠纷,应本着友好的原则协商解决;如协商不成,应向所在地的法院提起诉讼。
    </p>

    <h3>独立性</h3>
    <p>本协议中的某些条款因故无法适用,则本协议的其他条款继续适用且无法适用的条款将会被修改,以便其能够依法适用。
    </p>

    <h3>完整性</h3>
    <p>本协议(包括隐私政策)是您和本产品之间关于本产品相关事项的最终的、完整的、排他的协议,且取代和合并之前当事人关于此类事项(包括之前的最终用户许可、服务条款和隐私政策)的讨论和协议;
        <br/>每部分的题目只为阅读之便而无任何法律或合同义务;
        <br/>除非我们书面同意,您不得转让本协议所规定的权利义务。任何违反上述规定企图转让的行为均无效。
    </p>

    <b>某某某APP对以上条款保有最终解释权。</b>
</string>

privacy_policy.html

<!--隐私政策-->
<string name="privacy_policy">
    <Data>我们希望通过本《隐私政策》向您说明,在使用我们的服务时,我们如何收集、使用、储存和分享这些信息,以及我们为您提供的访问、更新、控制和保护这些信息的方式。
        <br>本《隐私政策》与您所使用的服务息息相关,希望您仔细阅读,在需要时,按照本《隐私政策》的指引,作出您认为适当的选择。
        <h3>未成年人使用服务</h3>
        <p>
            我们鼓励父母或监护人指导未满十八岁的未成年人使用我们的服务。我们建议未成年人鼓励他们的父母或监护人阅读本《隐私政策》,并建议未成年人在提交的个人信息之前寻求父母或监护人的同意和指导。
        </p>

        <h3>适用范围</h3>
        <p>
            除某些特定服务外,我们所有的服务均适用本《隐私政策》。这些特定服务将适用特定的隐私政策。针对某些特定服务的特定隐私政策,将更具体地说明我们在该等服务中如何使用您的信息。该特定服务的隐私政策构成本《隐私政策》的一部分。如相关特定服务的隐私政策与本《隐私政策》有不一致之处,适用该特定服务的隐私政策。
            <br>请您注意,本《隐私政策》不适用于以下情况:
            <br>通过我们的服务而接入的第三方服务(包括任何第三方网站)收集的信息;
            <br>通过在我们服务中进行广告服务的其他公司或机构所收集的信息。
        </p>

        <h3>变更</h3>
        <p>
            我们可能适时修订本《隐私政策》的条款,该等修订构成本《隐私政策》的一部分。如该等修订造成您在本《隐私政策》下权利的实质减少。在该种情况下,若您继续使用我们的服务,即表示同意受经修订的本《隐私政策》的约束。
        </p>
        <h4>更新时间:2022年7月25号</h4>
        <h4>生效时间:2022年7月25号</h4>
    </Data>
</string>

ProtocolActivity.java

创建ProtocolActivity界面

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.MenuItem;
import android.webkit.WebView;

import java.util.Objects;

public class ProtocolActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_protocol);
        //初始化控件
        initData();
    }

    //返回按钮的点击事件
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
        }
        return true;
    }

    //初始化控件
    @SuppressLint("SetTextI18n")
    private void initData() {
        //返回按钮
        Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
        //设置标题栏
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setHomeButtonEnabled(true);
            actionBar.setDisplayHomeAsUpEnabled(true);
            //设置Bar标题
            actionBar.setTitle("用户协议");
        }
        WebView webview = findViewById(R.id.protocol);
        webview.loadUrl("file:///android_asset/user_agreement.html");
    }
}

activity_protocol.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".ProtocolActivity">

    <WebView
        android:id="@+id/protocol"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textIsSelectable="true"
        android:textSize="15sp" />
</androidx.constraintlayout.widget.ConstraintLayout>

PrivacyActivity.java

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.MenuItem;
import android.webkit.WebView;

import java.util.Objects;

public class PrivacyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_privacy);
        //初始化控件
        initData();
    }

    //返回按钮的点击事件
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
        }
        return true;
    }

    //初始化控件
    @SuppressLint("SetTextI18n")
    private void initData() {
        //返回按钮
        Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
        //设置标题栏
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setHomeButtonEnabled(true);
            actionBar.setDisplayHomeAsUpEnabled(true);
            //设置Bar标题
            actionBar.setTitle("隐私政策");
        }
        WebView webview = findViewById(R.id.privacy);
        webview.loadUrl("file:///android_asset/privacy_policy.html");
    }
}

activity_privacy.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".PrivacyActivity">

    <WebView
        android:id="@+id/privacy"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textIsSelectable="true"
        android:textSize="15sp" />
</androidx.constraintlayout.widget.ConstraintLayout>

实现方法二:

效果图

在这里插入图片描述

另一种实现弹窗方式

直接在SplashActivity类的Oncreate方法中直接调用即可!

public void isFirstStart() {
        SharedPreferences preferences = getSharedPreferences("NB_FIRST_START", 0);
        boolean isFirst = preferences.getBoolean("FIRST_START", true);
        if (isFirst) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            TextView title = new TextView(this);
            title.setText(Html.fromHtml("<font color='#008b8b'>" + "用户协议和隐私政策" + "</font>"));
            title.setPadding(0, 30, 0, 15);
            title.setGravity(Gravity.CENTER);
            title.setTextSize(18);
            title.setTextColor(Color.BLACK);

            // 拼接字符串
            SpannableStringBuilder spanBuilder = new SpannableStringBuilder("欢迎您使用某某某APP,根据个人信息安全规范的要求,尊重并保护用户的个人隐私安全,请您在使用前仔细阅读");
            //用户协议
            SpannableString span = new SpannableString("《用户协议》");
            // 用户协议点击事件
            span.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    Intent intent = new Intent(MainActivity.this, ProtocolActivity.class);
                    startActivity(intent);
                }
            }, 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            // 设置颜色、下划线
            span.setSpan(new ForegroundColorSpan(Color.parseColor("#008b8b")), 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            spanBuilder.append(span);

            spanBuilder.append("与");

            //隐私政策
            span = new SpannableString("《隐私政策》");
            span.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    Intent intent = new Intent(MainActivity.this, PrivacyActivity.class);
                    startActivity(intent);
                }
            }, 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            span.setSpan(new ForegroundColorSpan(Color.parseColor("#008b8b")), 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            spanBuilder.append(span);

            spanBuilder.append("条款,同意后开启我们的服务。");

            TextView popupContent = new TextView(this);

            //自定义弹窗内容
            popupContent.setMovementMethod(LinkMovementMethod.getInstance());
            popupContent.setText(spanBuilder);
            // 设置高亮颜色透明,因为点击会变色
            popupContent.setHighlightColor(ContextCompat.getColor(getApplicationContext(), R.color.white));
            popupContent.setPadding(40, 0, 40, 0);
            popupContent.setTextSize(16);
            popupContent.setLineSpacing(8, 1); // 设置行间距
            popupContent.setTextColor(Color.parseColor("#5C5C5C"));

            // 创建自定义的圆角Drawable形状作为对话框的背景
            GradientDrawable shape = new GradientDrawable();
            shape.setShape(GradientDrawable.RECTANGLE);
            shape.setCornerRadius(30); // 根据需要设置圆角半径
            shape.setColor(Color.WHITE); // 设置背景颜色

            builder.setCustomTitle(title)
                    .setView(popupContent)
                    .setCancelable(false)
                    // 添加同意和取消按钮及其回调函数
                    .setPositiveButton("同意", (dialog1, which) -> {
                        // 在此处添加同意按钮的逻辑
                        preferences.edit().putBoolean("FIRST_START", false).apply();
                        startActivity(new Intent(SplashActivity.this, MainActivity.class));
                        finish();
                    })

                    .setNeutralButton("不同意", (dialog12, which) -> {
                        // 在此处添加取消按钮的逻辑
                        finish();
                    });
            // 将自定义背景形状设置为对话框窗口的背景
            Dialog dialog = builder.create();
            dialog.getWindow().setBackgroundDrawable(shape);
            dialog.show();
        } else {
            preferences.edit().putBoolean("FIRST_START", false).apply();
            Handler handler = new Handler();
            handler.postDelayed(() -> {
                startActivity(new Intent(SplashActivity.this, MainActivity.class));
                finish();
            }, 2000);
        }
    }
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值