当前位置:   article > 正文

Android studio 对接经常要弹出隐私协议界面_android studio 实现弹窗 隐私页面

android studio 实现弹窗 隐私页面

前言:

        现在都比较注重隐私信息了,所以很经常碰到要添加隐私协议弹窗。对于一些偷懒技术来说,有个现成的代码或封装好的东西,就是最省事的。没必要花过多的时间去处理。

        嗯,本菜鸟也偷懒,就不直接封装了,直接把对应的代码放上,需要的直接把对应的代码拷贝到自己工程项目中,然后调用使用就可以了,省事。

1.肯定是少不了隐私弹窗的界面啦。所以,在layout目录下创建一个界面。

   本菜鸟起的名字就是activity_privacy_policy.xml,你们用什么自己喜欢呗。

    直接上activity_privacy_policy的代码。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. android:background="@drawable/dialog_privacy_bg"
  8. >
  9. <RelativeLayout
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"
  12. android:layout_alignParentBottom="true"
  13. >
  14. <LinearLayout
  15. android:layout_width="match_parent"
  16. android:layout_height="match_parent"
  17. android:layout_above="@+id/ll_btn_bottom"
  18. android:layout_marginBottom="35dp"
  19. android:gravity="center"
  20. android:orientation="vertical"
  21. tools:ignore="UnknownId">
  22. <TextView
  23. android:id="@+id/tv_title"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:layout_marginTop="10dp"
  27. android:layout_marginBottom="10dp"
  28. android:text="用户使用协议"
  29. android:textColor="@color/colorBlack"
  30. android:textSize="18sp"
  31. />
  32. <ScrollView
  33. android:layout_width="match_parent"
  34. android:layout_height="match_parent"
  35. android:layout_marginLeft="5dp"
  36. android:layout_marginRight="5dp"
  37. android:layout_marginBottom="15dp"
  38. android:fadingEdgeLength="60dp"
  39. android:requiresFadingEdge="horizontal">
  40. <TextView
  41. android:id="@+id/tv_content"
  42. android:layout_width="match_parent"
  43. android:layout_height="match_parent"
  44. android:layout_marginTop="10dp"
  45. android:singleLine="false"
  46. android:text=""
  47. android:textColor="@color/colorBlack"
  48. />
  49. </ScrollView>
  50. </LinearLayout>
  51. <LinearLayout
  52. android:id="@+id/BtnView"
  53. android:layout_width="match_parent"
  54. android:layout_height="wrap_content"
  55. android:layout_alignParentStart="true"
  56. android:layout_alignParentBottom="true"
  57. android:gravity="bottom">
  58. <Button
  59. android:id="@+id/btn_exit"
  60. android:layout_width="0dp"
  61. android:layout_height="32dp"
  62. android:layout_weight="1"
  63. android:background="@color/colorWhite"
  64. android:text="@string/privacy_exit"
  65. android:textColor="@color/colorGray"
  66. android:textSize="16sp"
  67. android:textStyle="bold" />
  68. <View
  69. android:layout_width="0.25dp"
  70. android:layout_height="40dp"
  71. android:background="@color/colorGray" />
  72. <Button
  73. android:id="@+id/btn_enter"
  74. android:layout_width="0dp"
  75. android:layout_height="32dp"
  76. android:layout_weight="1"
  77. android:background="@color/colorWhite"
  78. android:text="@string/privacy_agree"
  79. android:textColor="@color/colorOrange"
  80. android:textSize="16sp"
  81. android:textStyle="bold" />
  82. </LinearLayout>
  83. </RelativeLayout>
  84. </LinearLayout>

2.既然有弹出界面,那就有弹出界面的bg代码,所以在drawable目录下创建一个dialog_privacy_bg.xml。

代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!--填充设置-->
  4. <solid android:color="@android:color/white" />
  5. <!--圆角设置-->
  6. <corners android:radius="6dp" />
  7. </shape>

3.然后少不了颜色设置啦。直接上在values目录下的colors.xml里面补上填充颜色。例如本菜鸟所用到的颜色

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <color name="colorPrimary">#008577</color>
  4. <color name="colorPrimaryDark">#00574B</color>
  5. <color name="colorAccent">#D81B60</color>
  6. <color name="colorWhite">#FFFFFFFF</color>
  7. <color name="colorBlack">#FF000000</color>
  8. <color name="colorGray">#878787</color>
  9. <color name="colorOrange">#FFE26C25</color>
  10. <color name="colorBlue">#FF036EB8</color>
  11. </resources>

4.颜色有了,少不了文字嘛。所以在values目录下的strings.xml里面按钮文字之类的。本菜鸟用

  1. <string name="privacy_exit">退出</string>
  2. <string name="privacy_agree">同意</string>

这两个作为确定和拒绝隐私内容的按钮文字,你们喜欢用什么自己确定嘛。毕竟,我不可能逼你要用和我一样的。

5.实现隐私弹窗的前提内容已经准备好了,那就少不了开始调用隐私弹窗的了,隐私内容毕竟是第一次进入的时候需要的,那就少不了根据实际情况做处理,其次隐私一般都有两个,一个是用户协议,一个是隐私协议。所以,那个前那个后,看需求啦,

  5.1既然只需要显示一次的,那就需要保存数据,直接上保存数据工具类。

  1. package //包名我就隐藏了
  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. import java.util.Map;
  5. /**
  6. * 数据缓存到本地
  7. * **/
  8. public class DataUtils {
  9. /**
  10. * 保存在手机里的SP文件名
  11. */
  12. public static final String FILE_NAME = "privacy_sp";
  13. /**
  14. * 保存数据
  15. */
  16. public static void put(Context context, String key, Object obj) {
  17. SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
  18. SharedPreferences.Editor editor = sp.edit();
  19. if (obj instanceof Boolean) {
  20. editor.putBoolean(key, (Boolean) obj);
  21. } else if (obj instanceof Float) {
  22. editor.putFloat(key, (Float) obj);
  23. } else if (obj instanceof Integer) {
  24. editor.putInt(key, (Integer) obj);
  25. } else if (obj instanceof Long) {
  26. editor.putLong(key, (Long) obj);
  27. } else {
  28. editor.putString(key, (String) obj);
  29. }
  30. editor.commit();
  31. }
  32. public static boolean isKeep(Context context, String key, Object defaultObj){
  33. SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
  34. if(sp.contains(key))
  35. {
  36. }
  37. return false;
  38. }
  39. /**
  40. * 获取指定数据
  41. */
  42. @org.jetbrains.annotations.Nullable
  43. public static Object get(Context context, String key, Object defaultObj) {
  44. SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
  45. if (defaultObj instanceof Boolean) {
  46. return sp.getBoolean(key, (Boolean) defaultObj);
  47. } else if (defaultObj instanceof Float) {
  48. return sp.getFloat(key, (Float) defaultObj);
  49. } else if (defaultObj instanceof Integer) {
  50. return sp.getInt(key, (Integer) defaultObj);
  51. } else if (defaultObj instanceof Long) {
  52. return sp.getLong(key, (Long) defaultObj);
  53. } else if (defaultObj instanceof String) {
  54. return sp.getString(key, (String) defaultObj);
  55. }
  56. return null;
  57. }
  58. /**
  59. * 删除指定数据
  60. */
  61. public static void remove(Context context, String key) {
  62. SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
  63. SharedPreferences.Editor editor = sp.edit();
  64. editor.remove(key);
  65. editor.commit();
  66. }
  67. /**
  68. * 返回所有键值对
  69. */
  70. public static Map<String, ?> getAll(Context context) {
  71. SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
  72. Map<String, ?> map = sp.getAll();
  73. return map;
  74. }
  75. /**
  76. * 删除所有数据
  77. */
  78. public static void clear(Context context) {
  79. SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
  80. SharedPreferences.Editor editor = sp.edit();
  81. editor.clear();
  82. editor.commit();
  83. }
  84. /**
  85. * 检查key对应的数据是否存在
  86. */
  87. public static boolean contains(Context context, String key) {
  88. SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
  89. return sp.contains(key);
  90. }
  91. }

5.2保存数据类有了,那就开干弄隐私界面代码,毕竟本菜鸟没有封装,所以就直接上用到的隐私弹窗代码。使用的时候,可以自己进行封装一下,也可以直接扔到Activity类里面。

  1. 1.既然是保存第一次数据的。所以,执行调用隐私前,必须拿到是否同意哪个隐私内容了。
  2. String isPrivacy = DataUtils.get(MainActivity.this,"privacy","0").toString();
  3. String isPolicy = DataUtils.get(MainActivity.this,"policy","0").toString();
  4. 2.有两个隐私,那就需要在全局定义一个变量来确保当前属于那个隐私的
  5. /**当前表现的隐私类型:
  6. * 1:个人信息隐私
  7. * 2:使用条款
  8. * **/
  9. private int prviacyType = 1;
  10. 注意:一个是用户协议记录状态,一个是隐私协议记录状态。至于那个,你们自己定也可以看我的。
  11. 3.拿到状态后,就判断弹出那个协议界面了。
  12. //没有同意隐私条约的,则弹出隐私条约
  13. if(isPrivacy.equals("1") && isPolicy.equals("1"))
  14. {
  15. //都同意了,直接跳过隐私弹窗处理
  16. }else if(isPrivacy.equals("0"))
  17. {
  18. prviacyType = 1;
  19. showPrivacy("privacy.txt","个人信息隐私");
  20. }else if(isPrivacy.equals("1")&& isPolicy.equals("0"))
  21. {
  22. prviacyType = 2;
  23. showPrivacy("policy.txt","使用条款");
  24. }
  25. 4.前置内容都设定了,那就开始调用弹出隐私,并且根据调用的隐私内容去加载隐私内容回来并且展示出来。
  26. public void showPrivacy(String privacyFileName,String title) {
  27. //加载当前要显示的隐私内容文本
  28. String str = initAssets(privacyFileName);
  29. //布局ui界面信息
  30. final View inflate = LayoutInflater.from(this).inflate(R.layout.activity_privacy_policy, null);
  31. TextView tv_title = (TextView) inflate.findViewById(R.id.tv_title);
  32. //设置隐私内容抬头
  33. tv_title.setText(title);
  34. //显示隐私内容,因为文本布局,需要美观,所以内容用需要使用换行符,但加载回来的内容用\n的话无法真正做到换行,只能在文本中用<br/>作为换行符,然后进行替换成\n
  35. TextView tv_content = (TextView) inflate.findViewById(R.id.tv_content);
  36. tv_content.setText(str.replace("<br/>", "\n"));
  37. //获取同意和退出两个按钮并且添加事件
  38. TextView btn_exit = (TextView) inflate.findViewById(R.id.btn_exit);
  39. TextView btn_enter = (TextView) inflate.findViewById(R.id.btn_enter);
  40. //开始弹出隐私界面
  41. final Dialog dialog = new AlertDialog
  42. .Builder(this)
  43. .setView(inflate)
  44. .show();
  45. //对话框弹出后点击或按返回键不消失
  46. dialog.setCancelable(false);
  47. WindowManager m = getWindowManager();
  48. Display defaultDisplay = m.getDefaultDisplay();
  49. final WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
  50. params.width = (int) (defaultDisplay.getWidth() * 0.90);
  51. dialog.getWindow().setAttributes(params);
  52. dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
  53. //退出按钮事件
  54. btn_exit.setOnClickListener(new View.OnClickListener() {
  55. @Override
  56. public void onClick(View v) {
  57. dialog.dismiss();
  58. finish();
  59. }
  60. });
  61. //同意按钮事件
  62. btn_enter.setOnClickListener(new View.OnClickListener() {
  63. @Override
  64. public void onClick(View v) {
  65. dialog.dismiss();
  66. if(prviacyType == 1)
  67. {
  68. prviacyType = 2;
  69. //保存隐私同意状态
  70. DataUtils.put(MainActivity.this,"privacy","1");
  71. //显示下一个隐私内容
  72. showPrivacy("policy.txt","使用条款");
  73. }else if(prviacyType == 2)
  74. {
  75. DataUtils.put(MainActivity.this,"policy","1");
  76. //两个隐私内容都确定后,开始执行下一步
  77. }
  78. }
  79. });
  80. }
  81. /**
  82. * 从assets下的txt文件中读取数据
  83. */
  84. public String initAssets(String fileName) {
  85. String str = null;
  86. try {
  87. InputStream inputStream = getAssets().open(fileName);
  88. str = getString(inputStream);
  89. } catch (IOException e1) {
  90. e1.printStackTrace();
  91. }
  92. return str;
  93. }
  94. public static String getString(InputStream inputStream) {
  95. InputStreamReader inputStreamReader = null;
  96. try {
  97. inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
  98. } catch (UnsupportedEncodingException e1) {
  99. e1.printStackTrace();
  100. }
  101. BufferedReader reader = new BufferedReader(inputStreamReader);
  102. StringBuffer sb = new StringBuffer("");
  103. String line;
  104. try {
  105. while ((line = reader.readLine()) != null) {
  106. sb.append(line);
  107. sb.append("");
  108. }
  109. } catch (IOException e) {
  110. e.printStackTrace();
  111. }
  112. return sb.toString();
  113. }

结束:

        至此隐私弹窗就已经处理好了。隐私文本内容就不提供了,这些每一家的都不一样的。具体叫提供隐私的相关人员提供即可。

        注意事项:本菜鸟在弄的时候遇到的坑

        1.文本编码问题。所以隐私为txt文本格式,但一定要处理编码,要不读取回来的隐私内容为乱码。

        2.文本换行问题,隐私内容不可能没有段落之类的,如果直接不加任何换行符进去,加载回来的内容不换行的,但如果使用\n作为换行符,在文本窗口里面展示根本无法与自己想象的一致,所以直接采取<br>作为换行符。在隐私文本中,根据自己美观需求,在每一段落后加一个或多个。然后在加载回来后,用\n替换<br/>实现换行。

        3.隐私弹窗的界面大小,需要根据自己实际情况而定,毕竟需要美观又不是全屏覆盖。所以,大家都懂的,虽然流传着技术的美观就是一坨屎,但能好看点就弄好看点嘛。起码自己看的过去。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/267100
推荐阅读
相关标签
  

闽ICP备14008679号