MVP框架用于实现登录注册的方法和步骤_精简版源码

下面写一下登录注册的步骤
1.先搭建一个MVP的框架
2.然后把登录祖册融入到MVP框架中
4.再把最基本的布局写一下
5.然后写登录的源码
6.最后把注册的源码写一下
这是最基本的步骤,写的不是很详细还望大家多多见谅

第一步先把依赖写一下,这是最重要的
我把我这个项目的依赖给全部复制过来了,没有煽选还望大家见谅,多多益处O(∩_∩)O哈哈~

 //圆形进度条加载依赖
    implementation 'com.czp.arcProgressBar:ArcProgressBar:1.0.1'
    /*banner轮播图 依赖*/
    implementation 'com.youth.banner:banner:1.4.9'
    //导入Design包
    implementation 'com.android.support:design:28.+'
    //Okgo
    implementation 'com.lzy.net:okgo:3.0.4'
    //Butterknife
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    //Glide加载图片
    implementation 'com.github.bumptech.glide:glide:3.7.0'
    //*ZXing二维码扫描*/
    implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.2.1'
    /*Picasso*/
    implementation 'com.squareup.picasso:picasso:2.3.2'
    /*gson解析*/
    implementation 'com.google.code.gson:gson:2.8.5'
    /*okhttp网络请求*/
    implementation 'com.squareup.okhttp3:okhttp:3.12.0'
    //RecyclerView
    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
    //image-loader
    implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
    //banner仿魅族的依赖
    implementation 'com.github.pinguo-zhouwei:MZBannerView:v2.0.2'
    implementation 'com.facebook.fresco:fresco:1.11.0'

第二步权限
登录注册只有一个获取网络的权限

 <uses-permission android:name="android.permission.INTERNET" />

我们现在写的是登录的MVP,下面是效果图

在这里插入图片描述

现在开始登录的操作
下面写一下用MVP框架写的登录的契约接口

import gsp.com.dimensionbusiness.data.bean.LoginBean;

public interface ILoginContract {

    public interface ILoginView {
        //回显数据
        public void showData(LoginBean loginBean);
    }

    //P层
    public interface ILoginPresenter<ILoginView> {
        //绑定
        public void attahView(ILoginContract.ILoginView loginView);

        //解绑
        public void detachView(ILoginContract.ILoginView loginView);

        //数据获取
        public void requestData(String name, String password);
    }

    //M层
    public interface ILoginModel {
        //请求数据
        public void containData(String name, String password, CallBack callBack);

        //接口回调
        public interface CallBack {
            public void onCallBack(LoginBean repsoneData);
        }
    }
}

然后写一下登录P层的类实现一下我们在登录契约类的P层的方法

import java.lang.ref.SoftReference;

import gsp.com.dimensionbusiness.data.bean.LoginBean;
import gsp.com.dimensionbusiness.di.consentar.ILoginContract;
import gsp.com.dimensionbusiness.di.mdel.LoginModel;

public class LoginPresenter implements ILoginContract.ILoginPresenter<ILoginContract.ILoginView> {
    ILoginContract.ILoginView loginView;
    private SoftReference<ILoginContract.ILoginView> reference;
    private LoginModel model;

    @Override
    public void attahView(ILoginContract.ILoginView loginView) {
        this.loginView = loginView;
        reference = new SoftReference<>(loginView);
        model = new LoginModel();
    }

    @Override
    public void detachView(ILoginContract.ILoginView loginView) {
        reference.clear();
    }

    @Override
    public void requestData(String name, String password) {
        model.containData(name,password,new ILoginContract.ILoginModel.CallBack() {
            @Override
            public void onCallBack(LoginBean repsoneData) {
                loginView.showData(repsoneData);
            }
        });
    }
}

最后写一下登录M层的类实现一下我们在登录契约类中M层的方法

import com.google.gson.Gson;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;

import gsp.com.dimensionbusiness.data.Contain;
import gsp.com.dimensionbusiness.data.bean.LoginBean;
import gsp.com.dimensionbusiness.di.consentar.ILoginContract;

public class LoginModel implements ILoginContract.ILoginModel {
    @Override
    public void containData(String name, String password, final CallBack callBack) {
        String urlString = Contain.LOGIN + "?phone=" + name + "&pwd=" + password;
        OkGo.<String>post(urlString).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                String responseData = response.body().toString();
                Gson gson = new Gson();
                LoginBean loginBean = gson.fromJson(responseData, LoginBean.class);
                callBack.onCallBack(loginBean);
            }
        });
    }
}

现在我们把登录的MVP写完了
现在我们开始入手登录的具体方法的布局
先写一下登录的布局,我登录是用的适配器,最后我会把适配器的类专门给写出来

<RelativeLayout 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"
    android:background="@mipmap/back_xh"
    tools:context=".BusinessActivity">

    <ImageView
        android:id="@+id/login_phone"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_marginTop="@dimen/dp_200"
        android:layout_alignLeft="@id/view1"
        android:background="@mipmap/phone"
        />
    <EditText
        android:id="@+id/EditText_name"
        android:layout_toRightOf="@id/login_phone"
        android:layout_width="@dimen/dp_260"
        android:layout_height="@dimen/dp_20"
        android:layout_marginTop="@dimen/dp_200"
        android:hint="手机号"
        android:background="@null"
        android:paddingLeft="@dimen/dp_20"
        android:textSize="@dimen/sp_18"
        android:maxLength="11"
        android:textColor="#fff"
        android:textColorHint="#fff"
        />
    <View
        android:id="@+id/view1"
        android:layout_width="@dimen/dp_280"
        android:layout_height="@dimen/dp_2"
        android:layout_below="@id/EditText_name"
        android:background="#fff"
        android:layout_marginBottom="@dimen/dp_10"
        android:layout_marginTop="@dimen/dp_10"
        android:layout_centerHorizontal="true"
        />
    <ImageView
        android:id="@+id/login_icon_lock"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_marginTop="@dimen/dp_20"
        android:layout_below="@id/view1"
        android:layout_alignLeft="@+id/view1"
        android:background="@mipmap/key"
        />
    <EditText
        android:id="@+id/EditText_password"
        android:layout_width="@dimen/dp_230"
        android:layout_marginTop="@dimen/dp_20"
        android:layout_height="@dimen/dp_20"
        android:hint="登录密码"
        android:background="@null"
        android:textSize="@dimen/dp_18"
        android:textColor="#fff"
        android:textColorHint="#fff"
        android:layout_toRightOf="@id/login_icon_lock"
        android:layout_below="@id/view1"
        android:paddingLeft="@dimen/dp_20"
        android:inputType="numberPassword"
        />
    <View
        android:id="@+id/view2"
        android:layout_width="@dimen/dp_280"
        android:layout_height="@dimen/dp_2"
        android:layout_below="@id/EditText_password"
        android:background="#fff"
        android:layout_marginBottom="@dimen/dp_10"
        android:layout_marginTop="@dimen/dp_10"
        android:layout_centerHorizontal="true"
        />
    <ImageView
        android:id="@+id/yan"
        android:layout_width="@dimen/dp_30"
        android:layout_height="@dimen/dp_20"
        android:background="@mipmap/login_icon_eye"
        android:layout_toRightOf="@id/EditText_password"
        android:layout_alignBottom="@id/EditText_password"
        />
    <CheckBox
        android:id="@+id/button_jizhu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="记住密码"
        android:layout_below="@id/view2"
        android:layout_marginTop="@dimen/dp_15"
        android:textColor="#fff"
        android:buttonTint="#fff"
        android:layout_alignLeft="@+id/view2"
        android:textSize="@dimen/sp_14"
        />
    <TextView
        android:id="@+id/button_register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="快速注册"
        android:layout_marginTop="@dimen/dp_15"
        android:gravity="center"
        android:textSize="@dimen/sp_14"
        android:layout_below="@id/view2"
        android:layout_alignBottom="@id/button_jizhu"
        android:layout_alignRight="@+id/view2"
        android:textColor="#fff"
        />
    <Button
        android:id="@+id/login"
        android:layout_width="wrap_content"
        android:layout_height="@dimen/dp_40"
        android:layout_below="@id/button_jizhu"
        android:text="登录"
        android:textSize="@dimen/sp_18"
        android:textColor="#ff5f71"
        android:background="@drawable/shape_button"
        android:layout_alignLeft="@+id/view1"
        android:layout_alignRight="@+id/view1"
        android:layout_marginTop="@dimen/dp_102"
        android:layout_marginBottom="@dimen/dp_120"
        />

</RelativeLayout>

下面开始激动人心的时刻了,开始调用方法用于实现登录的效果,我还里面加了一个显示和隐藏密码的小功能

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.InputType;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import gsp.com.dimensionbusiness.data.bean.LoginBean;
import gsp.com.dimensionbusiness.di.consentar.ILoginContract;
import gsp.com.dimensionbusiness.di.prenser.LoginPresenter;

public class BusinessActivity extends AppCompatActivity implements ILoginContract.ILoginView {


    @BindView(R.id.login_phone)
    ImageView loginPhone;
    @BindView(R.id.EditText_name)
    EditText EditTextName;
    @BindView(R.id.view1)
    View view1;
    @BindView(R.id.login_icon_lock)
    ImageView loginIconLock;
    @BindView(R.id.EditText_password)
    EditText EditTextPassword;
    @BindView(R.id.view2)
    View view2;
    @BindView(R.id.yan)
    ImageView yan;
    @BindView(R.id.button_jizhu)
    CheckBox buttonJizhu;
    @BindView(R.id.button_register)
    TextView buttonRegister;
    @BindView(R.id.login)
    Button login;
    private int eyeType = 0;
    private LoginPresenter loginPresenter;
    private SharedPreferences sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_business);
        ButterKnife.bind(this);
        //创建P层
        loginPresenter = new LoginPresenter();
        loginPresenter.attahView(this);
        //记住密码
        sp = getSharedPreferences("login", MODE_PRIVATE);
        if (sp.getBoolean("c1", false)) {
            EditTextName.setText(sp.getString("name", ""));
            EditTextPassword.setText(sp.getString("pwd", ""));
            buttonJizhu.setChecked(true);
        }

        //点击跳转页面
        buttonRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(BusinessActivity.this, RegisterActivity.class);
                startActivity(intent);
            }
        });

        isPasswordShowListener();
    }

    private void isPasswordShowListener() {
        yan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (eyeType == 0) {
                    //点击隐藏密码
                    EditTextPassword.setInputType(false ?
                            (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) :
                            (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
                    eyeType = 1;
                } else {
                    //或者显示密码
                    EditTextPassword.setInputType(true ?
                            (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) :
                            (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
                    eyeType = 0;
                }
                EditTextPassword.setSelection(EditTextPassword.getText().length());

            }
        });
    }

    @Override
    public void showData(final LoginBean loginBean) {
        //判断是否登录成功
        //getStatus是成功的状态码0000
        if (loginBean.getStatus().equals("0000")) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //getMessage是成功码
                    Toast.makeText(BusinessActivity.this, "" + loginBean.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
            startActivity(new Intent(BusinessActivity.this, ShowActivity.class));
        } else {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(BusinessActivity.this, "" + loginBean.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }

    }

    @OnClick({R.id.login})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.login:
                String name = EditTextName.getText().toString();
                String password = EditTextPassword.getText().toString();
                loginPresenter.requestData(name, password);
                //记住密码
                SharedPreferences.Editor editor = sp.edit();
                editor.putString("name", name);
                editor.putString("pwd", password);
                editor.putBoolean("c1", buttonJizhu.isChecked());
                editor.commit();
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //P
        loginPresenter.detachView(this);
    }

}

现在我们写一下注册的MVP框架,下面是效果图
在这里插入图片描述

现在开始操作注册的框架
下面写一下用MVP写的注册契约接口

import gsp.com.dimensionbusiness.data.bean.RegisterBean;

public interface IRegisterContract {

    public interface IRegisterView {
        //回显数据
        public void showData(RegisterBean registerBean);
    }

    //P层
    public interface IRegisterPresenter<IRegisterView> {
        //绑定
        public void attahView(IRegisterContract.IRegisterView registerView);

        //解绑
        public void detachView(IRegisterContract.IRegisterView registerView);

        //数据获取
        public void requestData(String name, String password);
    }

    //M层
    public interface IRegisterModel {
        //请求数据
        public void containData(String name, String password, CallBack callBack);

        //接口回调
        public interface CallBack {
            public void onCallBack(RegisterBean registerBean);
        }
    }
}

然后写一下P层的类实现一下我们在注册的契约类中P层的方法

import java.lang.ref.SoftReference;

import gsp.com.dimensionbusiness.data.bean.LoginBean;
import gsp.com.dimensionbusiness.data.bean.RegisterBean;
import gsp.com.dimensionbusiness.di.consentar.ILoginContract;
import gsp.com.dimensionbusiness.di.consentar.IRegisterContract;
import gsp.com.dimensionbusiness.di.mdel.LoginModel;
import gsp.com.dimensionbusiness.di.mdel.RegisterModel;

public class RegisterPresenter implements IRegisterContract.IRegisterPresenter<IRegisterContract.IRegisterView> {
    IRegisterContract.IRegisterView registerView;
    private SoftReference<IRegisterContract.IRegisterView> softReference;
    private RegisterModel registerModel;

    @Override
    public void attahView(IRegisterContract.IRegisterView registerView) {
        this.registerView = registerView;
        softReference = new SoftReference<>(registerView);
        registerModel = new RegisterModel();
    }

    @Override
    public void detachView(IRegisterContract.IRegisterView registerView) {
        softReference.clear();
    }

    @Override
    public void requestData(String name, String password) {
        registerModel.containData(name,password,new IRegisterContract.IRegisterModel.CallBack() {
            @Override
            public void onCallBack(RegisterBean registerBean) {
                registerView.showData(registerBean);
            }
        });
    }


}

最后写一下M层的类实现一下我们在注册中契约类中M层的方法

import com.google.gson.Gson;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;

import gsp.com.dimensionbusiness.data.Contain;
import gsp.com.dimensionbusiness.data.bean.RegisterBean;
import gsp.com.dimensionbusiness.di.consentar.IRegisterContract;

public class RegisterModel implements IRegisterContract.IRegisterModel {
    @Override
    public void containData(String name, String password, final CallBack callBack) {
       //这行代码是调用接口的,Contain这个类我专门放接口,我怕你们看不懂  我来解释一下
        String urlString = Contain.REGISTER+ "?phone=" + name + "&pwd=" + password;
        OkGo.<String>post(urlString).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                String responseData = response.body().toString();
                Gson gson = new Gson();
                RegisterBean registerBean = gson.fromJson(responseData, RegisterBean.class);
                callBack.onCallBack(registerBean);
            }
        });
    }
}

现在我们把注册的MVP写完了
现在我们开始入手注册的具体方法和布局
先写一下注册的布局,我注册是用的适配器,最后我会把适配器的类专门给写出来

<RelativeLayout 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"
    android:background="@mipmap/back_xh"
    tools:context=".RegisterActivity">

    <ImageView
        android:id="@+id/sign_phone"
        android:layout_width="@dimen/dp_20"
        android:layout_height="@dimen/dp_20"
        android:layout_alignLeft="@id/view1"
        android:layout_marginTop="@dimen/dp_160"
        android:src="@mipmap/phone" />
    <EditText
        android:id="@+id/EditText_name"
        android:layout_width="@dimen/dp_260"
        android:layout_height="@dimen/dp_20"
        android:hint="手机号"
        android:layout_toRightOf="@id/sign_phone"
        android:layout_marginTop="@dimen/dp_160"
        android:paddingLeft="@dimen/dp_20"
        android:maxLength="11"
        android:textSize="@dimen/dp_18"
        android:inputType="number"
        android:textColorHint="#fff"
        android:textColor="#fff"
        android:background="@null"
        />
    <View
        android:id="@+id/view1"
        android:layout_width="@dimen/dp_280"
        android:layout_height="@dimen/dp_1"
        android:layout_below="@+id/EditText_name"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="@dimen/dp_10"
        android:layout_marginBottom="@dimen/dp_20"
        android:background="#fff"
        />
    <ImageView
        android:id="@+id/lipai"
        android:layout_width="@dimen/dp_20"
        android:layout_height="@dimen/dp_20"
        android:layout_marginTop="@dimen/dp_15"
        android:src="@mipmap/dun"
        android:layout_below="@id/view1"
        android:layout_alignLeft="@id/view1"
        />
    <EditText
        android:id="@+id/EditText_Verification"
        android:layout_below="@id/view1"
        android:layout_toRightOf="@+id/sign_phone"
        android:layout_width="@dimen/dp_190"
        android:layout_marginTop="@dimen/dp_15"
        android:layout_height="@dimen/dp_20"
        android:paddingLeft="@dimen/dp_20"
        android:background="@null"
        android:hint="验证码"
        android:textSize="@dimen/sp_18"
        android:maxLength="6"
        android:inputType="number"
        android:textColorHint="#fff"
        android:textColor="#fff"
        />
    <TextView
        android:id="@+id/sign_get_code"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/EditText_Verification"
        android:text="获取验证码"
        android:textColor="#fff"
        android:layout_alignBottom="@id/EditText_Verification"
        />
    <View
        android:id="@+id/view2"
        android:layout_width="@dimen/dp_280"
        android:layout_height="@dimen/dp_1"
        android:layout_below="@id/EditText_Verification"
        android:layout_centerVertical="true"
        android:layout_marginTop="@dimen/dp_10"
        android:layout_marginBottom="@dimen/dp_20"
        android:background="#fff"
        android:layout_alignLeft="@id/view1"
        />
    <ImageView
        android:id="@+id/sign_lock"
        android:layout_width="@dimen/dp_20"
        android:layout_marginTop="@dimen/dp_15"
        android:layout_height="@dimen/dp_20"
        android:src="@mipmap/key"
        android:layout_below="@id/view2"
        android:layout_alignLeft="@id/view2"
        />
    <EditText
        android:id="@+id/EditText_password"
        android:layout_width="@dimen/dp_230"
        android:layout_height="@dimen/dp_20"
        android:layout_alignLeft="@id/sign_lock"
        android:layout_toRightOf="@id/sign_lock"
        android:layout_marginLeft="@dimen/dp_20"
        android:paddingLeft="@dimen/dp_20"
        android:layout_below="@id/view2"
        android:background="@null"
        android:layout_marginTop="@dimen/dp_15"
        android:hint="登录密码"
        android:textColor="#fff"
        android:textSize="@dimen/dp_18"
        android:inputType="numberPassword"
        android:textColorHint="#fff"
        />

    <ImageView
        android:id="@+id/yan"
        android:layout_width="@dimen/dp_24"
        android:layout_height="@dimen/dp_20"
        android:layout_alignBottom="@id/EditText_password"
        android:layout_toRightOf="@id/EditText_password"
        android:src="@mipmap/login_icon_eye" />
    <View
        android:id="@+id/view3"
        android:layout_width="@dimen/dp_280"
        android:layout_height="@dimen/dp_1"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/EditText_password"
        android:layout_marginTop="@dimen/dp_10"
        android:background="#fff"
        />
    <TextView
        android:id="@+id/keep"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/button_jizhu"
        android:text="已有账户?立即登录"
        android:layout_below="@id/view3"
        android:layout_marginTop="@dimen/dp_15"
        android:textSize="@dimen/dp_14"
        android:layout_alignRight="@id/view3"
        android:textColor="#fff"
        />
    <Button
        android:id="@+id/login"
        android:layout_width="@dimen/dp_280"
        android:layout_height="@dimen/dp_40"
        android:layout_alignLeft="@id/view1"
        android:layout_alignRight="@id/view1"
        android:text="注册"
        android:textColor="#ff5f71"
        android:textSize="@dimen/dp_18"
        android:background="@drawable/shape_button"
        android:layout_marginTop="@dimen/dp_100"
        android:layout_below="@id/keep"
        />

</RelativeLayout>

下面开始最激动人心的时刻了,开始调用方法用于实现注册的效果,我还里面加了一个显示和隐藏密码的小功能,还有就是验证码的具体功能我没有发布,还望大家见谅

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.InputType;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import gsp.com.dimensionbusiness.data.bean.RegisterBean;
import gsp.com.dimensionbusiness.di.consentar.IRegisterContract;
import gsp.com.dimensionbusiness.di.prenser.RegisterPresenter;

public class RegisterActivity extends AppCompatActivity implements IRegisterContract.IRegisterView {

    @BindView(R.id.sign_phone)
    ImageView signPhone;
    @BindView(R.id.EditText_name)
    EditText EditTextName;
    @BindView(R.id.view1)
    View view1;
    @BindView(R.id.lipai)
    ImageView lipai;
    @BindView(R.id.EditText_Verification)
    EditText EditTextVerification;
    @BindView(R.id.sign_get_code)
    TextView signGetCode;
    @BindView(R.id.view2)
    View view2;
    @BindView(R.id.sign_lock)
    ImageView signLock;
    @BindView(R.id.EditText_password)
    EditText EditTextPassword;
    @BindView(R.id.yan)
    ImageView yan;
    @BindView(R.id.view3)
    View view3;
    @BindView(R.id.keep)
    TextView keep;
    @BindView(R.id.login)
    Button login;
    private int eyeType = 0;
    private RegisterPresenter registerPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        ButterKnife.bind(this);
        isPasswordShowListener();


        //创建P层
        registerPresenter = new RegisterPresenter();
        registerPresenter.attahView(this);


        //
        keep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(RegisterActivity.this, BusinessActivity.class);
                startActivity(intent);
            }
        });


    }

    //这块是显示和隐藏密码的
    private void isPasswordShowListener() {
        yan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (eyeType == 0) {
                    //点击隐藏密码
                    EditTextPassword.setInputType(false ?
                            (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) :
                            (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
                    eyeType = 1;
                } else {
                    //或者显示密码
                    EditTextPassword.setInputType(true ?
                            (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) :
                            (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
                    eyeType = 0;
                }
                //以上,还有一个问题,切换显隐后,光标会跳到最前面,为了解决这个问题,需要加上以下代码
                EditTextPassword.setSelection(EditTextPassword.getText().length());
            }
        });


    }

    @Override
    public void showData(final RegisterBean registerBean) {
        //判断是否注册成功
        //getStatus是成功的状态码0000
        if (registerBean.getStatus().equals("0000")) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(RegisterActivity.this, "" + registerBean.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
            startActivity(new Intent(RegisterActivity.this, BusinessActivity.class));
        } else {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(RegisterActivity.this, "" + registerBean.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }

    }

    @OnClick({R.id.login})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.login:
                String name = EditTextName.getText().toString();
                String password = EditTextPassword.getText().toString();
                registerPresenter.requestData(name, password);
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //P
        registerPresenter.detachView(this);
    }

}

再发布一个自定义的圆角效果,用用实现登录注册按钮的,效果图我会发一下
如果需要的话可以用一下
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="15dp" />
    <solid android:color="#fff" />
    <size
        android:width="100dp"
        android:height="20dp" />
    <stroke
        android:width="1dp"
        android:color="#fff" />
</shape>

按照我上面的方法和步骤一步步写,现在应该可以实现登录注册的效果了
最后我来把我上面挖的坑给填一下,下面我写一下最简单的适配器,用于屏幕适配,这个适配器效果不是很好还望大家见谅,可以实现大部分手机屏幕

下面发写一下,你们复制一下就可以用

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Your custom size defind by references, can be writted in anywhere, any module, any values/*.xml, for example: -->
    <dimen name="card_common_margin_left">@dimen/dp_15</dimen>

    <!-- dp and sp values, must be defind in this file! -->
    <!-- view size,you can add if there is no one -->
    <dimen name="dp_m_60">-60dp</dimen>
    <dimen name="dp_m_30">-30dp</dimen>
    <dimen name="dp_m_20">-20dp</dimen>
    <dimen name="dp_m_12">-12dp</dimen>
    <dimen name="dp_m_10">-10dp</dimen>
    <dimen name="dp_m_8">-8dp</dimen>
    <dimen name="dp_m_5">-5dp</dimen>
    <dimen name="dp_m_2">-2dp</dimen>
    <dimen name="dp_m_1">-1dp</dimen>
    <dimen name="dp_0">0dp</dimen>
    <dimen name="dp_0_1">0.1dp</dimen>
    <dimen name="dp_0_5">0.5dp</dimen>
    <dimen name="dp_1">1dp</dimen>
    <dimen name="dp_1_5">1.5dp</dimen>
    <dimen name="dp_2">2dp</dimen>
    <dimen name="dp_2_5">2.5dp</dimen>
    <dimen name="dp_3">3dp</dimen>
    <dimen name="dp_3_5">3.5dp</dimen>
    <dimen name="dp_4">4dp</dimen>
    <dimen name="dp_4_5">4.5dp</dimen>
    <dimen name="dp_5">5dp</dimen>
    <dimen name="dp_6">6dp</dimen>
    <dimen name="dp_7">7dp</dimen>
    <dimen name="dp_7_5">7.5dp</dimen>
    <dimen name="dp_8">8dp</dimen>
    <dimen name="dp_9">9dp</dimen>
    <dimen name="dp_10">10dp</dimen>
    <dimen name="dp_11">11dp</dimen>
    <dimen name="dp_12">12dp</dimen>
    <dimen name="dp_13">13dp</dimen>
    <dimen name="dp_14">14dp</dimen>
    <dimen name="dp_15">15dp</dimen>
    <dimen name="dp_16">16dp</dimen>
    <dimen name="dp_17">17dp</dimen>
    <dimen name="dp_18">18dp</dimen>
    <dimen name="dp_19">19dp</dimen>
    <dimen name="dp_20">20dp</dimen>
    <dimen name="dp_21">21dp</dimen>
    <dimen name="dp_22">22dp</dimen>
    <dimen name="dp_23">23dp</dimen>
    <dimen name="dp_24">24dp</dimen>
    <dimen name="dp_25">25dp</dimen>
    <dimen name="dp_26">26dp</dimen>
    <dimen name="dp_27">27dp</dimen>
    <dimen name="dp_28">28dp</dimen>
    <dimen name="dp_29">29dp</dimen>
    <dimen name="dp_30">30dp</dimen>
    <dimen name="dp_31">31dp</dimen>
    <dimen name="dp_32">32dp</dimen>
    <dimen name="dp_33">33dp</dimen>
    <dimen name="dp_34">34dp</dimen>
    <dimen name="dp_35">35dp</dimen>
    <dimen name="dp_36">36dp</dimen>
    <dimen name="dp_37">37dp</dimen>
    <dimen name="dp_38">38dp</dimen>
    <dimen name="dp_39">39dp</dimen>
    <dimen name="dp_40">40dp</dimen>
    <dimen name="dp_41">41dp</dimen>
    <dimen name="dp_42">42dp</dimen>
    <dimen name="dp_43">43dp</dimen>
    <dimen name="dp_44">44dp</dimen>
    <dimen name="dp_45">45dp</dimen>
    <dimen name="dp_46">46dp</dimen>
    <dimen name="dp_47">47dp</dimen>
    <dimen name="dp_48">48dp</dimen>
    <dimen name="dp_49">49dp</dimen>
    <dimen name="dp_50">50dp</dimen>
    <dimen name="dp_51">51dp</dimen>
    <dimen name="dp_52">52dp</dimen>
    <dimen name="dp_53">53dp</dimen>
    <dimen name="dp_54">54dp</dimen>
    <dimen name="dp_55">55dp</dimen>
    <dimen name="dp_56">56dp</dimen>
    <dimen name="dp_57">57dp</dimen>
    <dimen name="dp_58">58dp</dimen>
    <dimen name="dp_59">59dp</dimen>
    <dimen name="dp_60">60dp</dimen>
    <dimen name="dp_61">61dp</dimen>
    <dimen name="dp_62">62dp</dimen>
    <dimen name="dp_63">63dp</dimen>
    <dimen name="dp_64">64dp</dimen>
    <dimen name="dp_65">65dp</dimen>
    <dimen name="dp_66">66dp</dimen>
    <dimen name="dp_67">67dp</dimen>
    <dimen name="dp_68">68dp</dimen>
    <dimen name="dp_69">69dp</dimen>
    <dimen name="dp_70">70dp</dimen>
    <dimen name="dp_71">71dp</dimen>
    <dimen name="dp_72">72dp</dimen>
    <dimen name="dp_73">73dp</dimen>
    <dimen name="dp_74">74dp</dimen>
    <dimen name="dp_75">75dp</dimen>
    <dimen name="dp_76">76dp</dimen>
    <dimen name="dp_77">77dp</dimen>
    <dimen name="dp_78">78dp</dimen>
    <dimen name="dp_79">79dp</dimen>
    <dimen name="dp_80">80dp</dimen>
    <dimen name="dp_81">81dp</dimen>
    <dimen name="dp_82">82dp</dimen>
    <dimen name="dp_83">83dp</dimen>
    <dimen name="dp_84">84dp</dimen>
    <dimen name="dp_85">85dp</dimen>
    <dimen name="dp_86">86dp</dimen>
    <dimen name="dp_87">87dp</dimen>
    <dimen name="dp_88">88dp</dimen>
    <dimen name="dp_89">89dp</dimen>
    <dimen name="dp_90">90dp</dimen>
    <dimen name="dp_91">91dp</dimen>
    <dimen name="dp_92">92dp</dimen>
    <dimen name="dp_93">93dp</dimen>
    <dimen name="dp_94">94dp</dimen>
    <dimen name="dp_95">95dp</dimen>
    <dimen name="dp_96">96dp</dimen>
    <dimen name="dp_97">97dp</dimen>
    <dimen name="dp_98">98dp</dimen>
    <dimen name="dp_99">99dp</dimen>
    <dimen name="dp_100">100dp</dimen>
    <dimen name="dp_101">101dp</dimen>
    <dimen name="dp_102">102dp</dimen>
    <dimen name="dp_103">103dp</dimen>
    <dimen name="dp_104">104dp</dimen>
    <dimen name="dp_104_5">104.5dp</dimen>
    <dimen name="dp_105">105dp</dimen>
    <dimen name="dp_106">106dp</dimen>
    <dimen name="dp_107">107dp</dimen>
    <dimen name="dp_108">108dp</dimen>
    <dimen name="dp_109">109dp</dimen>
    <dimen name="dp_110">110dp</dimen>
    <dimen name="dp_111">111dp</dimen>
    <dimen name="dp_112">112dp</dimen>
    <dimen name="dp_113">113dp</dimen>
    <dimen name="dp_114">114dp</dimen>
    <dimen name="dp_115">115dp</dimen>
    <dimen name="dp_116">116dp</dimen>
    <dimen name="dp_117">117dp</dimen>
    <dimen name="dp_118">118dp</dimen>
    <dimen name="dp_119">119dp</dimen>
    <dimen name="dp_120">120dp</dimen>
    <dimen name="dp_121">121dp</dimen>
    <dimen name="dp_122">122dp</dimen>
    <dimen name="dp_123">123dp</dimen>
    <dimen name="dp_124">124dp</dimen>
    <dimen name="dp_125">125dp</dimen>
    <dimen name="dp_126">126dp</dimen>
    <dimen name="dp_127">127dp</dimen>
    <dimen name="dp_128">128dp</dimen>
    <dimen name="dp_129">129dp</dimen>
    <dimen name="dp_130">130dp</dimen>
    <dimen name="dp_131">131dp</dimen>
    <dimen name="dp_132">132dp</dimen>
    <dimen name="dp_133">133dp</dimen>
    <dimen name="dp_134">134dp</dimen>
    <dimen name="dp_134_5">134.5dp</dimen>
    <dimen name="dp_135">135dp</dimen>
    <dimen name="dp_136">136dp</dimen>
    <dimen name="dp_137">137dp</dimen>
    <dimen name="dp_138">138dp</dimen>
    <dimen name="dp_139">139dp</dimen>
    <dimen name="dp_140">140dp</dimen>
    <dimen name="dp_141">141dp</dimen>
    <dimen name="dp_142">142dp</dimen>
    <dimen name="dp_143">143dp</dimen>
    <dimen name="dp_144">144dp</dimen>
    <dimen name="dp_145">145dp</dimen>
    <dimen name="dp_146">146dp</dimen>
    <dimen name="dp_147">147dp</dimen>
    <dimen name="dp_148">148dp</dimen>
    <dimen name="dp_149">149dp</dimen>
    <dimen name="dp_150">150dp</dimen>
    <dimen name="dp_151">151dp</dimen>
    <dimen name="dp_152">152dp</dimen>
    <dimen name="dp_153">153dp</dimen>
    <dimen name="dp_154">154dp</dimen>
    <dimen name="dp_155">155dp</dimen>
    <dimen name="dp_156">156dp</dimen>
    <dimen name="dp_157">157dp</dimen>
    <dimen name="dp_158">158dp</dimen>
    <dimen name="dp_159">159dp</dimen>
    <dimen name="dp_160">160dp</dimen>
    <dimen name="dp_161">161dp</dimen>
    <dimen name="dp_162">162dp</dimen>
    <dimen name="dp_163">163dp</dimen>
    <dimen name="dp_164">164dp</dimen>
    <dimen name="dp_165">165dp</dimen>
    <dimen name="dp_166">166dp</dimen>
    <dimen name="dp_167">167dp</dimen>
    <dimen name="dp_168">168dp</dimen>
    <dimen name="dp_169">169dp</dimen>
    <dimen name="dp_170">170dp</dimen>
    <dimen name="dp_171">171dp</dimen>
    <dimen name="dp_172">172dp</dimen>
    <dimen name="dp_173">173dp</dimen>
    <dimen name="dp_174">174dp</dimen>
    <dimen name="dp_175">175dp</dimen>
    <dimen name="dp_176">176dp</dimen>
    <dimen name="dp_177">177dp</dimen>
    <dimen name="dp_178">178dp</dimen>
    <dimen name="dp_179">179dp</dimen>
    <dimen name="dp_180">180dp</dimen>
    <dimen name="dp_181">181dp</dimen>
    <dimen name="dp_182">182dp</dimen>
    <dimen name="dp_183">183dp</dimen>
    <dimen name="dp_184">184dp</dimen>
    <dimen name="dp_185">185dp</dimen>
    <dimen name="dp_186">186dp</dimen>
    <dimen name="dp_187">187dp</dimen>
    <dimen name="dp_188">188dp</dimen>
    <dimen name="dp_189">189dp</dimen>
    <dimen name="dp_190">190dp</dimen>
    <dimen name="dp_191">191dp</dimen>
    <dimen name="dp_191_25">191.25dp</dimen>
    <dimen name="dp_192">192dp</dimen>
    <dimen name="dp_193">193dp</dimen>
    <dimen name="dp_194">194dp</dimen>
    <dimen name="dp_195">195dp</dimen>
    <dimen name="dp_196">196dp</dimen>
    <dimen name="dp_197">197dp</dimen>
    <dimen name="dp_198">198dp</dimen>
    <dimen name="dp_199">199dp</dimen>
    <dimen name="dp_200">200dp</dimen>
    <dimen name="dp_201">201dp</dimen>
    <dimen name="dp_202">202dp</dimen>
    <dimen name="dp_203">203dp</dimen>
    <dimen name="dp_204">204dp</dimen>
    <dimen name="dp_205">205dp</dimen>
    <dimen name="dp_206">206dp</dimen>
    <dimen name="dp_207">207dp</dimen>
    <dimen name="dp_208">208dp</dimen>
    <dimen name="dp_209">209dp</dimen>
    <dimen name="dp_210">210dp</dimen>
    <dimen name="dp_211">211dp</dimen>
    <dimen name="dp_212">212dp</dimen>
    <dimen name="dp_213">213dp</dimen>
    <dimen name="dp_214">214dp</dimen>
    <dimen name="dp_215">215dp</dimen>
    <dimen name="dp_216">216dp</dimen>
    <dimen name="dp_217">217dp</dimen>
    <dimen name="dp_218">218dp</dimen>
    <dimen name="dp_219">219dp</dimen>
    <dimen name="dp_220">220dp</dimen>
    <dimen name="dp_221">221dp</dimen>
    <dimen name="dp_222">222dp</dimen>
    <dimen name="dp_223">223dp</dimen>
    <dimen name="dp_224">224dp</dimen>
    <dimen name="dp_225">225dp</dimen>
    <dimen name="dp_226">226dp</dimen>
    <dimen name="dp_227">227dp</dimen>
    <dimen name="dp_228">228dp</dimen>
    <dimen name="dp_229">229dp</dimen>
    <dimen name="dp_230">230dp</dimen>
    <dimen name="dp_231">231dp</dimen>
    <dimen name="dp_232">232dp</dimen>
    <dimen name="dp_233">233dp</dimen>
    <dimen name="dp_234">234dp</dimen>
    <dimen name="dp_235">235dp</dimen>
    <dimen name="dp_236">236dp</dimen>
    <dimen name="dp_237">237dp</dimen>
    <dimen name="dp_238">238dp</dimen>
    <dimen name="dp_239">239dp</dimen>
    <dimen name="dp_240">240dp</dimen>
    <dimen name="dp_241">241dp</dimen>
    <dimen name="dp_242">242dp</dimen>
    <dimen name="dp_243">243dp</dimen>
    <dimen name="dp_244">244dp</dimen>
    <dimen name="dp_245">245dp</dimen>
    <dimen name="dp_246">246dp</dimen>
    <dimen name="dp_247">247dp</dimen>
    <dimen name="dp_248">248dp</dimen>
    <dimen name="dp_249">249dp</dimen>
    <dimen name="dp_250">250dp</dimen>
    <dimen name="dp_251">251dp</dimen>
    <dimen name="dp_252">252dp</dimen>
    <dimen name="dp_253">253dp</dimen>
    <dimen name="dp_254">254dp</dimen>
    <dimen name="dp_255">255dp</dimen>
    <dimen name="dp_256">256dp</dimen>
    <dimen name="dp_257">257dp</dimen>
    <dimen name="dp_258">258dp</dimen>
    <dimen name="dp_259">259dp</dimen>
    <dimen name="dp_260">260dp</dimen>
    <dimen name="dp_261">261dp</dimen>
    <dimen name="dp_262">262dp</dimen>
    <dimen name="dp_263">263dp</dimen>
    <dimen name="dp_264">264dp</dimen>
    <dimen name="dp_265">265dp</dimen>
    <dimen name="dp_266">266dp</dimen>
    <dimen name="dp_267">267dp</dimen>
    <dimen name="dp_268">268dp</dimen>
    <dimen name="dp_269">269dp</dimen>
    <dimen name="dp_270">270dp</dimen>
    <dimen name="dp_271">271dp</dimen>
    <dimen name="dp_272">272dp</dimen>
    <dimen name="dp_273">273dp</dimen>
    <dimen name="dp_274">274dp</dimen>
    <dimen name="dp_275">275dp</dimen>
    <dimen name="dp_276">276dp</dimen>
    <dimen name="dp_277">277dp</dimen>
    <dimen name="dp_278">278dp</dimen>
    <dimen name="dp_279">279dp</dimen>
    <dimen name="dp_280">280dp</dimen>
    <dimen name="dp_281">281dp</dimen>
    <dimen name="dp_282">282dp</dimen>
    <dimen name="dp_283">283dp</dimen>
    <dimen name="dp_284">284dp</dimen>
    <dimen name="dp_285">285dp</dimen>
    <dimen name="dp_286">286dp</dimen>
    <dimen name="dp_287">287dp</dimen>
    <dimen name="dp_288">288dp</dimen>
    <dimen name="dp_289">289dp</dimen>
    <dimen name="dp_290">290dp</dimen>
    <dimen name="dp_291">291dp</dimen>
    <dimen name="dp_292">292dp</dimen>
    <dimen name="dp_293">293dp</dimen>
    <dimen name="dp_294">294dp</dimen>
    <dimen name="dp_295">295dp</dimen>
    <dimen name="dp_296">296dp</dimen>
    <dimen name="dp_297">297dp</dimen>
    <dimen name="dp_298">298dp</dimen>
    <dimen name="dp_299">299dp</dimen>
    <dimen name="dp_300">300dp</dimen>
    <dimen name="dp_301">301dp</dimen>
    <dimen name="dp_302">302dp</dimen>
    <dimen name="dp_303">303dp</dimen>
    <dimen name="dp_304">304dp</dimen>
    <dimen name="dp_305">305dp</dimen>
    <dimen name="dp_306">306dp</dimen>
    <dimen name="dp_307">307dp</dimen>
    <dimen name="dp_308">308dp</dimen>
    <dimen name="dp_309">309dp</dimen>
    <dimen name="dp_310">310dp</dimen>
    <dimen name="dp_311">311dp</dimen>
    <dimen name="dp_312">312dp</dimen>
    <dimen name="dp_313">313dp</dimen>
    <dimen name="dp_314">314dp</dimen>
    <dimen name="dp_315">315dp</dimen>
    <dimen name="dp_316">316dp</dimen>
    <dimen name="dp_317">317dp</dimen>
    <dimen name="dp_318">318dp</dimen>
    <dimen name="dp_319">319dp</dimen>
    <dimen name="dp_320">320dp</dimen>
    <dimen name="dp_321">321dp</dimen>
    <dimen name="dp_322">322dp</dimen>
    <dimen name="dp_323">323dp</dimen>
    <dimen name="dp_324">324dp</dimen>
    <dimen name="dp_325">325dp</dimen>
    <dimen name="dp_326">326dp</dimen>
    <dimen name="dp_327">327dp</dimen>
    <dimen name="dp_328">328dp</dimen>
    <dimen name="dp_329">329dp</dimen>
    <dimen name="dp_330">330dp</dimen>
    <dimen name="dp_331">331dp</dimen>
    <dimen name="dp_332">332dp</dimen>
    <dimen name="dp_333">333dp</dimen>
    <dimen name="dp_334">334dp</dimen>
    <dimen name="dp_335">335dp</dimen>
    <dimen name="dp_336">336dp</dimen>
    <dimen name="dp_337">337dp</dimen>
    <dimen name="dp_338">338dp</dimen>
    <dimen name="dp_339">339dp</dimen>
    <dimen name="dp_340">340dp</dimen>
    <dimen name="dp_341">341dp</dimen>
    <dimen name="dp_342">342dp</dimen>
    <dimen name="dp_343">343dp</dimen>
    <dimen name="dp_344">344dp</dimen>
    <dimen name="dp_345">345dp</dimen>
    <dimen name="dp_346">346dp</dimen>
    <dimen name="dp_347">347dp</dimen>
    <dimen name="dp_348">348dp</dimen>
    <dimen name="dp_349">349dp</dimen>
    <dimen name="dp_350">350dp</dimen>
    <dimen name="dp_351">351dp</dimen>
    <dimen name="dp_352">352dp</dimen>
    <dimen name="dp_353">353dp</dimen>
    <dimen name="dp_354">354dp</dimen>
    <dimen name="dp_355">355dp</dimen>
    <dimen name="dp_356">356dp</dimen>
    <dimen name="dp_357">357dp</dimen>
    <dimen name="dp_358">358dp</dimen>
    <dimen name="dp_359">359dp</dimen>
    <dimen name="dp_360">360dp</dimen>
    <dimen name="dp_365">365dp</dimen>
    <dimen name="dp_370">370dp</dimen>
    <dimen name="dp_400">400dp</dimen>
    <dimen name="dp_410">410dp</dimen>
    <dimen name="dp_422">422dp</dimen>
    <dimen name="dp_472">472dp</dimen>
    <dimen name="dp_500">500dp</dimen>
    <dimen name="dp_600">600dp</dimen>
    <dimen name="dp_640">640dp</dimen>
    <dimen name="dp_720">720dp</dimen>

    <!-- font size,you can add if there is no one -->
    <dimen name="sp_6">6sp</dimen>
    <dimen name="sp_7">7sp</dimen>
    <dimen name="sp_8">8sp</dimen>
    <dimen name="sp_9">9sp</dimen>
    <dimen name="sp_10">10sp</dimen>
    <dimen name="sp_11">11sp</dimen>
    <dimen name="sp_12">12sp</dimen>
    <dimen name="sp_13">13sp</dimen>
    <dimen name="sp_14">14sp</dimen>
    <dimen name="sp_15">15sp</dimen>
    <dimen name="sp_16">16sp</dimen>
    <dimen name="sp_17">17sp</dimen>
    <dimen name="sp_18">18sp</dimen>
    <dimen name="sp_19">19sp</dimen>
    <dimen name="sp_20">20sp</dimen>
    <dimen name="sp_21">21sp</dimen>
    <dimen name="sp_22">22sp</dimen>
    <dimen name="sp_23">23sp</dimen>
    <dimen name="sp_24">24sp</dimen>
    <dimen name="sp_25">25sp</dimen>
    <dimen name="sp_28">28sp</dimen>
    <dimen name="sp_30">30sp</dimen>
    <dimen name="sp_32">32sp</dimen>
    <dimen name="sp_34">34sp</dimen>
    <dimen name="sp_36">36sp</dimen>
    <dimen name="sp_38">38sp</dimen>
    <dimen name="sp_40">40sp</dimen>
    <dimen name="sp_42">42sp</dimen>
    <dimen name="sp_48">48sp</dimen>

</resources>

最后完整的登录注册的源码写完了,如有不足还望大神们能多多指教

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43053718/article/details/86417321