MVP+Retrofit+RxJava+登录、注册
2018-01-18 20:55
399 查看
//1、导入相应的依赖
-------------------------网络请求工具类-------------------//3、创建ServiceAPi
public void onSuccess(T t);
public void onFailure(Exception e);
}//创建接口地址类public class URL_API {
public static final String BASE_URL = "https://www.zhaoapi.cn/";
public static final String LOGIN_URL = "user/login";
public static final String REGISTER_URL = "user/reg";
}
private String msg;
private String code;
private DataBean data;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
private Object age;
private String appkey;
private String appsecret;
private String createtime;
private Object email;
private Object fans;
private Object follow;
private Object gender;
private Object icon;
private Object latitude;
private Object longitude;
private String mobile;
private Object money;
private Object nickname;
private String password;
private Object praiseNum;
private String token;
private int uid;
private Object userId;
private String username;
public Object getAge() {
return age;
}
public void setAge(Object age) {
this.age = age;
}
public String getAppkey() {
return appkey;
}
public void setAppkey(String appkey) {
this.appkey = appkey;
}
public String getAppsecret() {
return appsecret;
}
public void setAppsecret(String appsecret) {
this.appsecret = appsecret;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public Object getEmail() {
return email;
}
public void setEmail(Object email) {
this.email = email;
}
public Object getFans() {
return fans;
}
public void setFans(Object fans) {
this.fans = fans;
}
public Object getFollow() {
return follow;
}
public void setFollow(Object follow) {
this.follow = follow;
}
public Object getGender() {
return gender;
}
public void setGender(Object gender) {
this.gender = gender;
}
public Object getIcon() {
return icon;
}
public void setIcon(Object icon) {
this.icon = icon;
}
public Object getLatitude() {
return latitude;
}
public void setLatitude(Object latitude) {
this.latitude = latitude;
}
public Object getLongitude() {
return longitude;
}
public void setLongitude(Object longitude) {
this.longitude = longitude;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public Object getMoney() {
return money;
}
public void setMoney(Object money) {
this.money = money;
}
public Object getNickname() {
return nickname;
}
public void setNickname(Object nickname) {
this.nickname = nickname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Object getPraiseNum() {
return praiseNum;
}
public void setPraiseNum(Object praiseNum) {
this.praiseNum = praiseNum;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public Object getUserId() {
return userId;
}
public void setUserId(Object userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
}//创建ILoginModelpublic interface ILoginModel {
public void login(String mobile, String password, OnNetListener<LoginBean> onNetListener);
}//创建LoginModel
//创建LoginActivitypublic class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener {
/**
* 请输入手机号
*/
private EditText mEtMobile;
/**
* 请输入密码
*/
private EditText mEtPassword;
/**
* 登录
*/
private Button mBtLogin;
/**
* 新用户注册
*/
private TextView mTvRegister;
private LoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
loginPresenter = new LoginPresenter(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.bt_login:
loginPresenter.login();
break;
case R.id.tv_register:
<LinearLayout 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:orientation="vertical"
tools:context="com.hh.newproject.view.LoginActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/leftjiantou" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="20sp"
android:text="登录" />
</RelativeLayout>
<EditText
android:id="@+id/et_mobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:password="true" />
<Button
android:id="@+id/bt_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="登录" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="忘记密码" />
<TextView
android:id="@+id/tv_register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="新用户注册" />
</RelativeLayout>
</LinearLayout>------------------------注册----------------------//RegisterBeanpublic class RegisterBean {
/**
* msg : 注册成功
* code : 0
*/
private String msg;
private String code;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}//创建IRegisterModelpublic interface IRegisterModel {
public void register(String mobile, String password, OnNetListener<RegisterBean> onNetListener);
}
//创建RegisterModel
/**
* 请输入手机号
*/
private EditText mEtMobile;
/**
* 请输入密码
*/
private EditText mEtPassword;
/**
* 注册
*/
private Button mBtRegister;
private ImageView mIvBack;
private RegisterPresenter registerPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
initView();
registerPresenter = new RegisterPresenter(this);
}
private void initView() {
mEtMobile = (EditText) findViewById(R.id.et_mobile);
mEtPassword = (EditText) findViewById(R.id.et_password);
mBtRegister = (Button) findViewById(R.id.bt_register);
mBtRegister.setOnClickListener(this);
mIvBack = (ImageView) findViewById(R.id.iv_back);
mIvBack.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.bt_register:
registerPresenter.register();
break;
case R.id.iv_back:
finish();
break;
}
}
@Override
public String getMobile() {
return mEtMobile.getText().toString().trim();
}
@Override
public String getPassword() {
return mEtPassword.getText().toString().trim();
}
@Override
public void Success(String str) {
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
}
@Override
public void failure(String str) {
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
}
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:orientation="vertical"
tools:context="com.hh.newproject.view.RegisterActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_back"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/leftjiantou" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="注册"
android:textSize="20sp" />
</RelativeLayout>
<EditText
android:id="@+id/et_mobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:password="true" />
<Button
android:id="@+id/bt_register"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="注册" />
</LinearLayout>
//retrofit2的依赖 compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' //rxJava2的依赖 compile 'io.reactivex.rxjava2:rxandroid:2.0.1' // Because RxAndroid releases are few and far between, it is recommended you also // explicitly depend on RxJava's latest version for bug fixes and new features. compile 'io.reactivex.rxjava2:rxjava:2.1.7'//拦截器
implementation 'com.squareup.okhttp3:logging-interceptor:+'//2、创建MVP模式所需要的包
-------------------------网络请求工具类-------------------//3、创建ServiceAPi
public interface ServiceApi { //登录 @GET(Urls.LOGIN_URL) Observable<LoginBean> login(@Query("mobile") String mobile, @Query("password") String password); //注册 @GET(Urls.REGISTER_URL) Observable<RegisterBean> register(@Query("mobile") String mobile, @Query("password") String password); }
------------创建RetrofitHelper类------------------
public class RetrofitHelper { private static OkHttpClient okHttpClient; private static HttpUtils httpUtils; static { initOkHttpClient(); } /** * 初始化OkHttpClient */ private static void initOkHttpClient() { if (okHttpClient == null) { synchronized (RetrofitHelper.class) { if (okHttpClient == null) { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); okHttpClient = new OkHttpClient.Builder() .addInterceptor(logging)
.addInterceptor(new MyInterceptor()).build();
} } } } /** * 定义一个泛型方法 * * @param tClass * @param url * @param <T> * @return */ public static <T> T createAPI(Class<T> tClass, String url) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); return retrofit.create(tClass); } public static HttpUtils getHttpUtils() { if (httpUtils == null) { synchronized (HttpUtils.class) { if (httpUtils == null) { httpUtils = createAPI(HttpUtils.class, API.HOST); } } } return httpUtils; }
/** * 添加公共参数拦截器 */ static class MyInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); HttpUrl httpUrl = request.url() .newBuilder() .addQueryParameter("source", "android") .build(); Request build = request.newBuilder() .url(httpUrl) .build(); return chain.proceed(build); } }}//5、创建回传类OnNetListenerpublic interface OnNetListener<T> {
public void onSuccess(T t);
public void onFailure(Exception e);
}//创建接口地址类public class URL_API {
public static final String BASE_URL = "https://www.zhaoapi.cn/";
public static final String LOGIN_URL = "user/login";
public static final String REGISTER_URL = "user/reg";
}
-----------------登录---------------//创建LoginBeanpublic class LoginBean {
private String msg;
private String code;
private DataBean data;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
private Object age;
private String appkey;
private String appsecret;
private String createtime;
private Object email;
private Object fans;
private Object follow;
private Object gender;
private Object icon;
private Object latitude;
private Object longitude;
private String mobile;
private Object money;
private Object nickname;
private String password;
private Object praiseNum;
private String token;
private int uid;
private Object userId;
private String username;
public Object getAge() {
return age;
}
public void setAge(Object age) {
this.age = age;
}
public String getAppkey() {
return appkey;
}
public void setAppkey(String appkey) {
this.appkey = appkey;
}
public String getAppsecret() {
return appsecret;
}
public void setAppsecret(String appsecret) {
this.appsecret = appsecret;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public Object getEmail() {
return email;
}
public void setEmail(Object email) {
this.email = email;
}
public Object getFans() {
return fans;
}
public void setFans(Object fans) {
this.fans = fans;
}
public Object getFollow() {
return follow;
}
public void setFollow(Object follow) {
this.follow = follow;
}
public Object getGender() {
return gender;
}
public void setGender(Object gender) {
this.gender = gender;
}
public Object getIcon() {
return icon;
}
public void setIcon(Object icon) {
this.icon = icon;
}
public Object getLatitude() {
return latitude;
}
public void setLatitude(Object latitude) {
this.latitude = latitude;
}
public Object getLongitude() {
return longitude;
}
public void setLongitude(Object longitude) {
this.longitude = longitude;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public Object getMoney() {
return money;
}
public void setMoney(Object money) {
this.money = money;
}
public Object getNickname() {
return nickname;
}
public void setNickname(Object nickname) {
this.nickname = nickname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Object getPraiseNum() {
return praiseNum;
}
public void setPraiseNum(Object praiseNum) {
this.praiseNum = praiseNum;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public Object getUserId() {
return userId;
}
public void setUserId(Object userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
}//创建ILoginModelpublic interface ILoginModel {
public void login(String mobile, String password, OnNetListener<LoginBean> onNetListener);
}//创建LoginModel
public class LoginModel implements ILoginModel { @Override public void login(String mobile, String password, final OnNetListener<LoginBean> onNetListener) { ServiceApi serviceApi = RetrofitHelper.getApi(); serviceApi.login(mobile, password) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<LoginBean>() { @Override public void accept(LoginBean loginBean) throws Exception { onNetListener.onSuccess(loginBean); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { onNetListener.onFailure(throwable); } }); } }//创建LgoinPresenter
public class LoginPresenter { private final ILoginModel iLoginModel; private ILoginView iLoginView; public LoginPresenter(ILoginView iLoginView) { this.iLoginView = iLoginView; iLoginModel = new LoginModel(); } public void login() { String mobile = iLoginView.getMobile(); String password = iLoginView.getPassword(); iLoginModel.login(mobile, password, new OnNetListener<LoginBean>() { @Override public void onSuccess(LoginBean loginBean) { iLoginView.suceess(loginBean.getMsg()); if (loginBean.getCode().equals("0")) { iLoginView.show(loginBean); iLoginView.toRegisterAc(); iLoginView.toMainAc(); } } @Override public void onFailure(Throwable throwable) { iLoginView.failure(throwable.getMessage()); } }); } public void toRegister() { iLoginView.toRegisterAc(); } }//创建ILoginViewpublic interface ILoginView {
public String getMobile(); public String getPassword(); public void suceess(String string); public void failure(String string); public void toRegisterAc(); public void toMainAc(); public void show(LoginBean loginBean);}
//创建LoginActivitypublic class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener {
/**
* 请输入手机号
*/
private EditText mEtMobile;
/**
* 请输入密码
*/
private EditText mEtPassword;
/**
* 登录
*/
private Button mBtLogin;
/**
* 新用户注册
*/
private TextView mTvRegister;
private LoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
loginPresenter = new LoginPresenter(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.bt_login:
loginPresenter.login();
break;
case R.id.tv_register:
loginPresenter.toRegister();break; } } private void initView() { mEtMobile = (EditText) findViewById(R.id.et_mobile); mEtPassword = (EditText) findViewById(R.id.et_password); mBtLogin = (Button) findViewById(R.id.bt_login); mBtLogin.setOnClickListener(this); mTvRegister = (TextView) findViewById(R.id.tv_register); mTvRegister.setOnClickListener(this); }
@Override public String getMobile() { return mEtPassword.getText().toString().trim(); } @Override public String getPassword() { return mEtPassword.getText().toString().trim(); } @Override public void suceess(String string) { Toast.makeText(getApplicationContext(), string, Toast.LENGTH_SHORT).show(); } @Override public void failure(String string) { Toast.makeText(getApplicationContext(), string, Toast.LENGTH_SHORT).show(); } @Override public void toRegisterAc() { Intent intent = new Intent(LoginActivity.this, RegisterActivity.class); startActivity(intent); } @Override public void toMainAc() { Intent intent = new Intent(LoginActivity.this, MainActivity.class); startActivity(intent); } @Override public void show(LoginBean loginBean) { if (loginBean.getCode().equals("0")) { int uid = loginBean.getData().getUid(); MyApp.edit.putInt("uid", uid); MyApp.edit.commit(); } }}//LoginActivity的XML布局<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
tools:context="com.hh.newproject.view.LoginActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/leftjiantou" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="20sp"
android:text="登录" />
</RelativeLayout>
<EditText
android:id="@+id/et_mobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:password="true" />
<Button
android:id="@+id/bt_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="登录" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="忘记密码" />
<TextView
android:id="@+id/tv_register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="新用户注册" />
</RelativeLayout>
</LinearLayout>------------------------注册----------------------//RegisterBeanpublic class RegisterBean {
/**
* msg : 注册成功
* code : 0
*/
private String msg;
private String code;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}//创建IRegisterModelpublic interface IRegisterModel {
public void register(String mobile, String password, OnNetListener<RegisterBean> onNetListener);
}
//创建RegisterModel
public class RegisterModel implements IRegisterModel { @Override public void register(String mobile, String password, final OnNetListener<RegisterBean> onNetListener) { ServiceApi serviceApi = RetrofitHelper.getApi(); serviceApi.register(mobile, password) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<RegisterBean>() { @Override public void accept(RegisterBean registerBean) throws Exception { onNetListener.onSuccess(registerBean); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { onNetListener.onFailure(throwable); } }); } }//创建RegisterPresenter
public class RegisterPresenter { private IRegisterView iRegisterView; private final IRegisterModel iRegisterModel; public RegisterPresenter(IRegisterView iRegisterView) { this.iRegisterView = iRegisterView; iRegisterModel = new RegisterModel(); } public void register() { String mobile = iRegisterView.getMobile(); String password = iRegisterView.getPassword(); iRegisterModel.register(mobile, password, new OnNetListener<RegisterBean>() { @Override public void onSuccess(RegisterBean registerBean) { iRegisterView.suceess(registerBean.getMsg()); if (registerBean.getCode().equals("0")) { iRegisterView.toLoginAc(); } } @Override public void onFailure(Throwable throwable) { iRegisterView.failure(throwable.getMessage()); } }); } }//创建IRegisterViewpublic interface IRegisterView {
public String getMobile(); public String getPassword(); public void suceess(String string); public void failure(String string); public void toLoginAc();}//创建RegisterActivitypublic class RegisterActivity extends AppCompatActivity implements View.OnClickListener, IRegisterView {
/**
* 请输入手机号
*/
private EditText mEtMobile;
/**
* 请输入密码
*/
private EditText mEtPassword;
/**
* 注册
*/
private Button mBtRegister;
private ImageView mIvBack;
private RegisterPresenter registerPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
initView();
registerPresenter = new RegisterPresenter(this);
}
private void initView() {
mEtMobile = (EditText) findViewById(R.id.et_mobile);
mEtPassword = (EditText) findViewById(R.id.et_password);
mBtRegister = (Button) findViewById(R.id.bt_register);
mBtRegister.setOnClickListener(this);
mIvBack = (ImageView) findViewById(R.id.iv_back);
mIvBack.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.bt_register:
registerPresenter.register();
break;
case R.id.iv_back:
finish();
break;
}
}
@Override
public String getMobile() {
return mEtMobile.getText().toString().trim();
}
@Override
public String getPassword() {
return mEtPassword.getText().toString().trim();
}
@Override
public void Success(String str) {
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
}
@Override
public void failure(String str) {
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
}
@Override public void toLoginAc() { Intent intent = new Intent(RegisterActivity.this, LoginActivity.class); startActivity(intent); }}//RegisterActivity的XML布局<LinearLayout 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:orientation="vertical"
tools:context="com.hh.newproject.view.RegisterActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_back"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/leftjiantou" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="注册"
android:textSize="20sp" />
</RelativeLayout>
<EditText
android:id="@+id/et_mobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:password="true" />
<Button
android:id="@+id/bt_register"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="注册" />
</LinearLayout>
相关文章推荐
- MVP+Retrofit+RxJava+登录、注册
- MVP+Retrofit+RxJava+登录、注册
- Android详细的登录注册功能MVP+Rxjava2.0+Retrofit2.0相结合的实战篇章
- retrofit+rxjava 登录注册
- Android mvp+Retrofit 登录注册
- MVP框架做的登陆注册,商品列表,商品详情,购物车功能 RxJava+Retrofit ijkplayer EventBus ButterKnife
- 原生登录注册和个人中心模块 Retrofit+OkHTTP+RxJava+Fresco
- Retrofit+rxjava+mvp实现登录
- Android Retrofit+Rxjava+MVP+EventBus+ButterKnife实现接口登录(无正则表达式)
- Retrofit+RxJava+Okhttp简单实现登录注册
- 封装Okhttp+retrofit+rxjava使用MVP模式实现登录注册
- 【Android实战】基于RxJava和Retrofit的登录注册(包含客户端和服务器端代码)
- mvp下rxjava+retrofit的登录网络请求demo
- MVP封装成基类结合retrofit和Rxjava
- 进阶之路:MVP+Retrofit+RxJava组合使用
- MVP封装成基类结合retrofit和Rxjava
- MVP之登录和注册
- RxJava+Retrofit+MVP
- 爱吖妹纸——Retrofit + RxJava + MVP 架构 APP 体验代码家的干货集中营 Gank.io,福利多多,不容错过
- MVP实现登录注册功能