Android封装用户协议
2020-11-18 本文已影响0人
奔跑的佩恩
前言
在Android
开发过程中,我们会涉及到用户协议
的问题,因为现在一般的app
在没有设置用户协议
的情况下,是不会审核通过的。用户协议
不是一个很难的功能,又必须要有,就像findById()
一样,没啥实际用处,但在开发的时候,又避免不了这样的代码,很是尴尬。为了节省开发时间,这里我将用户协议
功能做了一个模板封装类—AgreementDefaultHelper
,方便大家在开发中使用。
今天涉及内容:
- 用户协议封装类使用场景
- AgreementDefaultHelper主要方法介绍
- AgreementDefaultHelper在Activity中使用
- 在用户协议界面AgreementActivity的接收处理
- 效果图和项目结构图
- AgreementDefaultHelper源码
先来波效果图
1.gif
一.用户协议封装类使用场景
AgreementDefaultHelper
做为一个用户协议
封装的帮助类,提供了用户协议
和隐私协议
的通用固定文本模板。因此它适合在那些对用户协议
内容没有特殊要求的场景,可以加快app的开发进程。
二.AgreementDefaultHelper主要方法介绍
AgreementDefaultHelper
作为一个用户协议
封装的帮助类,具备以下主要方法:
/**获取用户协议弹框内容**/
public static String getAgreementDialogContent(String appName)
/***
* 用户协议弹框的设置(包括弹框内容,要点击的文字的颜色和设置点击事件)
*
* @param textView 设置用户协议弹框内容的textView
* @param appName app名称
* @param textColor 需要点击字段文字的颜色
* @param link 联系方式。设置为null的话表示"暂无"
* 添加电话的示例 Tel: 15927453658
* 添加qq的示例 QQ: 67030030
* @param userListener 《用户协议》点击事件
* @param privacyListener 《隐私协议》点击事件
*/
public static void clickAgreement(Context context,TextView textView, String appName, int textColor, String link, View.OnClickListener userListener, View.OnClickListener privacyListener)
/**获取用户协议**/
public static String getUserContent(String appName)
/**获取隐私协议**/
public static String getPrivacyContent(String appName)
三.AgreementDefaultHelper在Activity中使用
下面给出AgreementDefaultHelper
在Activity
中使用代码:
public class TempActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mTvTest;
private Button mBtnTest;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp);
//初始化控件
initView();
//初始化数据
initData();
//控件监听
setListener();
}
/**初始化控件**/
private void initView(){
mTvTest=findViewById(R.id.mTvTest);
mBtnTest=findViewById(R.id.mBtnTest);
}
private void initData(){
}
/**控件监听**/
private void setListener() {
mBtnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog();
}
});
}
@Override
public void onClick(View v) {
}
/**初始化并弹出对话框方法**/
private void showDialog(){
View view = LayoutInflater.from(this).inflate(R.layout.dialog_layout,null,false);
AlertDialog dialog = new AlertDialog.Builder(this).setView(view).create();
TextView textView = view.findViewById(R.id.tv);
Button btnCancel = view.findViewById(R.id.btn_cancel);
Button btnConfirm = view.findViewById(R.id.btn_confirm);
AgreementDefaultHelper.clickAgreement(this, textView, "测试app",
R.color.blue, null,
new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳转用户协议界面的监听
Intent intent=new Intent(TempActivity.this,AgreementActivity.class);
intent.putExtra( AgreementActivity.AGREEMENT_TAG,AgreementActivity.USER_TYPE);
startActivity(intent);
}
},
new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳转隐私协议界面的监听
Intent intent=new Intent(TempActivity.this,AgreementActivity.class);
intent.putExtra(AgreementActivity.AGREEMENT_TAG,AgreementActivity.PRIVACY_TYPE);
startActivity(intent);
}
});
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
//取消,退出app
ToastUtil.shortShow("====退出app======");
}
});
btnConfirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
//存储同意标记
//......
//同意,进入app流程
ToastUtil.shortShow("====同意,进入app流程======");
}
});
dialog.show();
//此处设置位置窗体大小,我这里设置为了手机屏幕宽度的3/4 注意一定要在show方法调用后再写设置窗口大小的代码,否则不起效果
dialog.getWindow().setLayout(ScreenUtil.getWidth()*3/4, LinearLayout.LayoutParams.WRAP_CONTENT);
}
}
其中AlertDialog
的布局dialog_layout.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:pain="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:paddingBottom="5dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:textSize="16sp"
android:textColor="@color/black"/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginStart="2dp"
android:layout_marginEnd="5dp"
app:layout_constraintEnd_toStartOf="@+id/btn_confirm"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv"
android:background="@color/color_e3e3e3"
android:textSize="16sp"
android:textColor="@color/black"
android:text="取消"/>
<Button
android:id="@+id/btn_confirm"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginStart="5dp"
android:layout_marginEnd="2dp"
android:background="@color/green"
app:layout_constraintBottom_toBottomOf="@+id/btn_cancel"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/btn_cancel"
app:layout_constraintTop_toTopOf="@+id/btn_cancel"
android:textSize="16sp"
android:textColor="@color/black"
android:text="确定"/>
</androidx.constraintlayout.widget.ConstraintLayout>
四.在用户协议界面AgreementActivity的接收处理
接下来看看用户协议界面AgreementActivity
的代码:
/**
* Title:用户协议界面
* description:
* autor:pei
* created on 2020/11/17
*/
public class AgreementActivity extends AppCompatActivity {
private TextView mTvTitle;
private TextView mTvContent;
public static final String AGREEMENT_TAG = "agreement_tag"; //跳转tag
public static final String USER_TYPE = "用户服务协议"; //用户协议
public static final String PRIVACY_TYPE = "隐私权政策"; //隐私协议
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_agreement);
mTvTitle=findViewById(R.id.tv_title);
mTvContent=findViewById(R.id.tv_content);
//获取上一界面数据
String tag= getIntent().getStringExtra(AGREEMENT_TAG);
String content=null;
switch (tag) {
case USER_TYPE:
content= AgreementDefaultHelper.getUserContent("测试app");
break;
case PRIVACY_TYPE:
content=AgreementDefaultHelper.getPrivacyContent("测试app");
break;
default:
break;
}
mTvTitle.setText(tag);
mTvContent.setText(content);
}
}
AgreementActivity
对应布局activity_agreement.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:pain="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=".MainActivity"
android:background="@color/white">
<TextView
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_height="40dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:background="@color/blue"
android:textColor="@color/black"
android:textSize="16sp"
android:gravity="center"/>
<androidx.core.widget.NestedScrollView
android:id="@+id/nsv"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_title">
<TextView
android:id="@+id/tv_content"
style="@style/tv_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:textColor="@color/black"
android:textSize="16sp" />
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
五.效果图和项目结构图
效果图.gif 项目结构图.png六.AgreementDefaultHelper源码
下面给出AgreementDefaultHelper
类源码: