本篇文章基本仅限于自己使用,先是一个模型,等有时间了我在慢慢加注释以及修改,成为大家公共资源
一、创建FirstgaService的Api接口
import com.wangjiulong.jiyun.mydyth_xiangmu.data.HttpResult;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.User;
import com.wangjiulong.jiyun.mydyth_xiangmu.news.HttpNewsResult;
import com.wangjiulong.jiyun.mydyth_xiangmu.news.HttpNewsTitle;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
public interface FirstgaService {
@POST("users/phoneLogin") //以键值对的方法传送请求体
Observable<HttpResult<User>> login(@Body Map<String, String> params);
@POST("users/sendVerificationCode")
Observable<HttpResult<Object>> sendVerificationCode(@Body Map<String, String> params);
//新闻频道
@POST("news/listNewsChannel") //以键值对的方法传送请求体\
Observable<HttpResult<HttpNewsTitle>> loginNews();
//新闻频道内容
@POST("news/upListNews") //以键值对的方法传送请求体\
Observable<HttpResult<HttpNewsResult>> loginNewsContent(@Body Map<String, String> params);
}
二、创建DataRetrofit类
mport java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.logging.HttpLoggingInterceptor;
import okio.Buffer;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class DataRetrofit {
private static final long DEFAULT_TIMEOUT = 20000;
public static FirstgaService getRetrofitService() {
//创建打印日志工具类,使打印出来的json语句更便于阅读,方便排查问题
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder requestBuilder = request.newBuilder();
request = requestBuilder
//关键部分,设置requestBody的编码格式为json
.addHeader("Content-Type", "application/json;charset=UTF-8")
.post(RequestBody.create(MediaType.parse("application/json;charset=UTF-8"),
bodyToString(request.body())))
.build();
return chain.proceed(request);
}
})
.addInterceptor(logging)
// 指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
// 指的是建立连接后从服务器读取到可用资源所用的时间。
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(AppConstact.BASE_URL)
.build();
return retrofit.create(FirstgaService.class);
}
//将请求体转化为string类型
private static String bodyToString(final RequestBody request) {
try {
final RequestBody copy = request;
final Buffer buffer = new Buffer();
if (copy != null)
copy.writeTo(buffer);
else
return "";
return buffer.readUtf8();
} catch (final IOException e) {
return "did not work";
}
}
}
三、创建UserDataSource接口
import com.trello.rxlifecycle2.components.support.RxFragment;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.User;
import com.wangjiulong.jiyun.mydyth_xiangmu.news.HttpNewsResult;
import com.wangjiulong.jiyun.mydyth_xiangmu.news.HttpNewsTitle;
import java.util.Map;
import io.reactivex.Observer;
public interface UserDataSource {
//这两个是仓库根目录
void login(RxFragment fragment, Map<String, String> params, Observer<User> observer);
void sendVerificationCode(RxFragment fragment, Map<String, String> params, Observer<Object> observer);
void requestSucc(RxFragment fragment, Observer<HttpNewsTitle> observer);
void requestContentSucc(RxFragment fragment,Map<String, String> params, Observer<HttpNewsResult> observer);
}
四、创建UserDataRepository仓库
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.trello.rxlifecycle2.components.support.RxFragment;
import com.trello.rxlifecycle2.internal.Preconditions;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.User;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.source.remote.UserRemoteDataSource;
import com.wangjiulong.jiyun.mydyth_xiangmu.news.HttpNewsResult;
import com.wangjiulong.jiyun.mydyth_xiangmu.news.HttpNewsTitle;
import java.util.Map;
import io.reactivex.Observer;
//实现仓库根目录的两个方法
public class UserDataRepository implements UserDataSource {
@NonNull
private UserDataSource mRemoteDataSource;
@Nullable
private static UserDataRepository INSTANCE = null;
private UserDataRepository(@NonNull UserDataSource remoteDataSource){
mRemoteDataSource = Preconditions.checkNotNull(remoteDataSource, "Login remote data source is not allowed null");
}
public static UserDataRepository getInstance(){
if(INSTANCE == null){
synchronized (UserDataRepository.class){
if(INSTANCE == null){
INSTANCE = new UserDataRepository(new UserRemoteDataSource());
}
}
}
return INSTANCE;
}
@Override
public void login(RxFragment fragment, Map<String, String> params, Observer<User> observer) {
mRemoteDataSource.login(fragment, params,observer);
}
@Override
public void sendVerificationCode(RxFragment fragment, Map<String, String> params, Observer<Object> observer) {
mRemoteDataSource.sendVerificationCode(fragment, params, observer);
}
@Override
public void requestSucc(RxFragment fragment, Observer<HttpNewsTitle> observer) {
mRemoteDataSource.requestSucc(fragment,observer);
}
@Override
public void requestContentSucc(RxFragment fragment, Map<String, String> params, Observer<HttpNewsResult> observer) {
mRemoteDataSource.requestContentSucc(fragment,params,observer);
}
}
五、创建UserRemoteDataSource 类
import com.trello.rxlifecycle2.android.FragmentEvent;
import com.trello.rxlifecycle2.components.support.RxFragment;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.HttpResult;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.User;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.source.UserDataSource;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.source.remote.retrofit.DataRetrofit;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.source.remote.retrofit.FirstgaService;
import com.wangjiulong.jiyun.mydyth_xiangmu.exception.ServerException;
import com.wangjiulong.jiyun.mydyth_xiangmu.news.HttpNewsResult;
import com.wangjiulong.jiyun.mydyth_xiangmu.news.HttpNewsTitle;
import java.util.Map;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
public class UserRemoteDataSource implements UserDataSource {
private FirstgaService service;
public UserRemoteDataSource() {
service = DataRetrofit.getRetrofitService();
}
//Rx数据流
@Override
public void login(RxFragment fragment, Map<String, String> params, Observer<User> observer) {
Observable<HttpResult<User>> observable = service.login(params);
observable.flatMap(new Function<HttpResult<User>, ObservableSource<User>>() {
@Override
public ObservableSource<User> apply(HttpResult<User> userHttpResult) throws Exception {
if (userHttpResult.getCode() == 0) {
return Observable.just(userHttpResult.getData());
}
return Observable.error(new ServerException(userHttpResult.getCode(),userHttpResult.getMessage()));
}
}).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(fragment.<User>bindUntilEvent(FragmentEvent.DETACH))
.subscribe(observer);
}
@Override
public void sendVerificationCode(RxFragment fragment, Map<String, String> params, Observer<Object> observer) {
Observable<HttpResult<Object>> observable = service.sendVerificationCode(params);
observable.flatMap(new Function<HttpResult<Object>, ObservableSource<Object>>() {
@Override
public ObservableSource<Object> apply(HttpResult<Object> userHttpResult) throws Exception {
if (userHttpResult.getCode() == 0) {
return Observable.just(new Object());
}
return Observable.error(new ServerException(userHttpResult.getCode(),userHttpResult.getMessage()));
}
}).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(fragment.<Object>bindUntilEvent(FragmentEvent.DETACH))
.subscribe(observer);
}
@Override
public void requestSucc(RxFragment fragment, Observer<HttpNewsTitle> observer) {
Observable<HttpResult<HttpNewsTitle>> observable = service.loginNews();
observable.flatMap(new Function<HttpResult<HttpNewsTitle>, ObservableSource<HttpNewsTitle>>() {
@Override
public ObservableSource<HttpNewsTitle> apply(HttpResult<HttpNewsTitle> userHttpResult) throws Exception {
if (userHttpResult.getCode() == 0) {
return Observable.just(userHttpResult.getData());
}
return Observable.error(new ServerException(userHttpResult.getCode(),userHttpResult.getMessage()));
}
}).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(fragment.<HttpNewsTitle>bindUntilEvent(FragmentEvent.DETACH))
.subscribe(observer);
}
@Override
public void requestContentSucc(RxFragment fragment, Map<String, String> params,Observer<HttpNewsResult> observer) {
Observable<HttpResult<HttpNewsResult>> observable = service.loginNewsContent(params);
observable.flatMap(new Function<HttpResult<HttpNewsResult>, ObservableSource<HttpNewsResult>>() {
@Override
public ObservableSource<HttpNewsResult> apply(HttpResult<HttpNewsResult> userHttpResult) throws Exception {
if (userHttpResult.getCode() == 0) {
return Observable.just(userHttpResult.getData());
}
return Observable.error(new ServerException(userHttpResult.getCode(),userHttpResult.getMessage()));
}
}).subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(fragment.<HttpNewsResult>bindUntilEvent(FragmentEvent.DETACH))
.subscribe(observer);
}
}
六、创建HttpResult实体类
public class HttpResult<T> {
private int code;
private String message;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
七、创建BaseActivity 类
import android.Manifest;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import com.umeng.socialize.UMShareAPI;
import java.util.List;
import static com.umeng.socialize.utils.ContextUtil.getContext;
public abstract class BaseActivity extends AppCompatActivity {
private int RESULT_LOAD_IMAGE=1;
protected FragmentManager mFragmentManager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFragmentManager = getSupportFragmentManager();
}
//添加Fragment,新建一个Fragment把前面的Fragment隐藏
public <T extends BaseFragment> void addFragment(@NonNull Class<T> tClass, BasePresenter presenter, int containerId, String tag, Bundle args) {
if(TextUtils.isEmpty(tag)){
tag = tClass.getName();
}
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
Fragment addedFragment = mFragmentManager.findFragmentByTag(tag);
BaseFragment targetFragment = null;
if(addedFragment == null){
try {
targetFragment = tClass.newInstance();
if(targetFragment instanceof BaseView){
((BaseView) targetFragment).setPresenter(presenter);
}
addFragmentAnimation(fragmentTransaction, targetFragment);
fragmentTransaction.add(containerId,targetFragment, tag);
} catch (Exception e) {
e.printStackTrace();
}
}else{
targetFragment = (BaseFragment) addedFragment;
if(targetFragment.isHidden()){
addFragmentAnimation(fragmentTransaction, targetFragment);
}
fragmentTransaction.show(targetFragment);
}
if(targetFragment != null){
addFragmentAnimation(fragmentTransaction, targetFragment);
hidePreFragment(fragmentTransaction, targetFragment);
if( targetFragment.isNeedAddToBackStack()){
fragmentTransaction.addToBackStack(null);
}
fragmentTransaction.commit();
}
}
private void addFragmentAnimation(FragmentTransaction transaction,BaseFragment baseFragment){
transaction.setCustomAnimations(baseFragment.getEnterAnimId(), baseFragment.getPreExistAnimId() ,baseFragment.getPopPreEnterAnimId(),baseFragment.getPopExistAnimId());
}
private void hidePreFragment(FragmentTransaction transaction,BaseFragment baseFragment){
if(baseFragment.isNeedHidePreFragment()){
List<Fragment> addedFragments = mFragmentManager.getFragments();
for(Fragment fragment: addedFragments){
if(fragment != baseFragment){
transaction.hide(fragment);
}
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
getUmengSDK();
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
//获取返回的数据,这里是android自定义的Uri地址
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
//获取选择照片的数据视图
Cursor cursor = getContext().getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
//从数据视图中获取已选择图片的路径
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
}
}
private void getUmengSDK(){
if(Build.VERSION.SDK_INT>=23){
String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CALL_PHONE,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.GET_ACCOUNTS,Manifest.permission.WRITE_APN_SETTINGS};
ActivityCompat.requestPermissions(this,mPermissionList,123);
}
}
}
八、创建BaseFragment 类
import android.content.Context;
import android.os.CountDownTimer;
import android.widget.TextView;
import com.trello.rxlifecycle2.components.support.RxFragment;
import com.wangjiulong.jiyun.mydyth_xiangmu.R;
public class BaseFragment extends RxFragment {
//把Activity的上下文传到Fragment里面
protected BaseActivity mActivity ;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mActivity = (BaseActivity)context;
}
protected boolean isNeedAddToBackStack(){
return true;
}
protected boolean isNeedHidePreFragment(){
return true;
}
protected int getEnterAnimId(){
return R.anim.slide_right_in;
}
protected int getPreExistAnimId(){
return R.anim.slide_left_out;
}
protected int getPopExistAnimId(){
return R.anim.slide_right_out;
}
protected int getPopPreEnterAnimId(){
return R.anim.slide_left_in;
}
//60秒倒计时
public void getTimedown(final TextView textView){
CountDownTimer timer = new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
textView.setEnabled(false);
textView.setText("已发送(" + millisUntilFinished / 1000 + ")");
}
@Override
public void onFinish() {
textView.setEnabled(true);
textView.setText("重新获取验证码");
}
}.start();
}
}
九、创建BasePresenter类
public interface BasePresenter<T extends BaseView> {
//防止内存泄漏
void attachView(T baseView);
void detachView();
}
十、创建BaseView类
public interface BaseView<T extends BasePresenter> {
//用来获取Presenter对象
void setPresenter(T presenter);
Activity getActivity() ;
}
十一、创建LoginActivity 类
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.Toast;
import com.wangjiulong.jiyun.mydyth_xiangmu.BackHandledInterface;
import com.wangjiulong.jiyun.mydyth_xiangmu.R;
import com.wangjiulong.jiyun.mydyth_xiangmu.base.BaseActivity;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.source.UserDataRepository;
public class LoginActivity extends BaseActivity implements BackHandledInterface {
private LoginFragment3 mPlaceholderFragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
LoginPresenter loginPresenter = new LoginPresenter(UserDataRepository.getInstance());
addFragment(LoginFragment.class, loginPresenter, R.id.login_container, null, null);
}
@Override
public void setSelectedFragment(LoginFragment3 selectedFragment) {
this.mPlaceholderFragment = selectedFragment;
}
@Override
public void onBackPressed() {
if (mPlaceholderFragment == null|| !mPlaceholderFragment.onBackPressed()) {
//处理
Toast.makeText(this,"哈啊哈哈123",Toast.LENGTH_LONG);
} else {
//处理
Toast.makeText(this,"哈啊哈哈456",Toast.LENGTH_LONG);
super.onBackPressed();
}
}
}
十二、创建LoginContract类
public interface LoginContract {
//接收返回的数据
public interface View extends BaseView<Presenter> {
//发送验证码成功
void verificationCodeSuccess();
//发送验证码失败
void verificationCodeFail();
//判断验证码和手机号是否对应 成功
void loginSuccess();
//判断验证码和手机号是否对应 失败
void loginFail(String msg);
}
//发送手机号和验证码的数据
public interface Presenter extends BasePresenter<View> {
//解析验证码 发送
void getVerificationCode(String phoneNumber);
//解析验证码 是否正确
void login(String phoneNumber,String code);
}
}
十三、创建LoginPresenter 类
import com.trello.rxlifecycle2.components.support.RxFragment;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.User;
import com.wangjiulong.jiyun.mydyth_xiangmu.data.source.UserDataSource;
import com.wangjiulong.jiyun.mydyth_xiangmu.utils.Logger;
import java.util.HashMap;
import java.util.Map;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
public class LoginPresenter implements LoginContract.Presenter{
private LoginContract.View mView;
private UserDataSource mUserDataRepository;
public LoginPresenter(UserDataSource userDataRepository){
mUserDataRepository = userDataRepository;
}
//解析完返回的数据在这里
@Override
public void getVerificationCode(String phoneNumber) {
Map<String,String> params = new HashMap<>();
params.put("phone", phoneNumber);
params.put("smsType", "0");
mUserDataRepository.sendVerificationCode((RxFragment) mView, params, new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {
Logger.d("onSubscribe");
}
@Override
public void onNext(Object o) {
mView.verificationCodeSuccess();
}
@Override
public void onError(Throwable e) {
mView.verificationCodeFail();
Logger.d("onError");
}
@Override
public void onComplete() {
Logger.d("onComplete");
}
});
}
//判断手机号和验证码是否对应的解析
@Override
public void login(String phoneNumber, String code) {
Map<String,String> params = new HashMap<>();
params.put("phone", phoneNumber);
params.put("verificationCode", code);
params.put("platform", "1");
params.put("appVersion", "1.0.0");
params.put("deviceId", "1454564545");
mUserDataRepository.login((RxFragment)mView, params, new Observer<User>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(User user) {
mView.loginSuccess();
}
@Override
public void onError(Throwable e) {
mView.loginFail(e.getMessage());
}
@Override
public void onComplete() {
}
});
}
十四、创建LoginFragment 类
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.text.style.URLSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.UMShareConfig;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.wangjiulong.jiyun.mydyth_xiangmu.R;
import com.wangjiulong.jiyun.mydyth_xiangmu.base.BaseFragment;
import com.wangjiulong.jiyun.mydyth_xiangmu.login.register.LoginFragment2;
import com.wangjiulong.jiyun.mydyth_xiangmu.login.register.RegisterPresenter;
import java.util.Map;
public class LoginFragment extends BaseFragment implements LoginContract.View {
private LoginContract.Presenter mPresenter;
private TextView mTvSendCode;
private TextView login_login_tv_license;
private EditText mEtvPhoneNumber;
private EditText mEtvVerificationCode;
private CheckBox mCbLisence;
private ImageView qq;
private ImageView boke;
private Button mBtnLoggin;
private LoginFragment2 loginFragment2 = new LoginFragment2();
private LoginActivity activity ;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_login ,container,false );
mTvSendCode = view.findViewById(R.id.login_btn_send_verification_code);
login_login_tv_license = view.findViewById(R.id.login_login_tv_license);
mEtvPhoneNumber = view.findViewById(R.id.login_etv_phone_number);
mEtvVerificationCode = view.findViewById(R.id.login_etv_verification_code);
mCbLisence = view.findViewById(R.id.login_cb_license);
qq = view.findViewById(R.id.qq);
boke = view.findViewById(R.id.boke);
tongYi();
mBtnLoggin = view.findViewById(R.id.login_btn_login);
boke.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//登录
UMShareConfig config = new UMShareConfig();
config.isNeedAuthOnGetUserInfo(true);
UMShareAPI.get(getContext()).setShareConfig(config);
UMShareAPI.get(getContext()).getPlatformInfo(getActivity(), SHARE_MEDIA.SINA, authListener);
}
});
qq.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//登录
UMShareConfig config = new UMShareConfig();
config.isNeedAuthOnGetUserInfo(true);
UMShareAPI.get(getContext()).setShareConfig(config);
UMShareAPI.get(getContext()).getPlatformInfo(getActivity(), SHARE_MEDIA.QQ, authListener);
}
});
mCbLisence.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mBtnLoggin.setEnabled(isChecked);
}
});
mTvSendCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNumber = mEtvPhoneNumber.getText().toString();
//TODO 需要做手机号校验
mPresenter.getVerificationCode(phoneNumber);
}
});
mBtnLoggin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNumber = mEtvPhoneNumber.getText().toString();
String code = mEtvVerificationCode.getText().toString();
mPresenter.login(phoneNumber, code);
}
});
return view;
}
//验证码发送成功
@Override
public void verificationCodeSuccess() {
mTvSendCode.setText(R.string.login_verification_code_send_ok);
getTimedown(mTvSendCode);
}
//验证码发送失败
@Override
public void verificationCodeFail() {
mTvSendCode.setText(R.string.login_verification_code_send_fail);
}
//判断手机号、验证码对应 成功
@Override
public void loginSuccess() {
RegisterPresenter presenter = new RegisterPresenter();
activity = (LoginActivity) getActivity();
activity.addFragment(LoginFragment2.class, presenter, R.id.login_container, null, null);
Toast.makeText(getContext(), "登录成功", Toast.LENGTH_SHORT).show();
}
//判断手机号、验证码对应 失败
@Override
public void loginFail(String msg) {
Toast.makeText(getContext(), "登录失败" +msg, Toast.LENGTH_SHORT).show();
}
//获取presenter 对象
@Override
public void setPresenter(LoginContract.Presenter presenter) {
mPresenter = presenter;
mPresenter.attachView(this);
}
UMAuthListener authListener = new UMAuthListener() {
@Override
public void onStart(SHARE_MEDIA platform) {
}
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
RegisterPresenter presenter = new RegisterPresenter();
activity = (LoginActivity) getActivity();
activity.addFragment(LoginFragment2.class, presenter, R.id.login_container, null, null);
Toast.makeText(getContext(), "成功了", Toast.LENGTH_LONG).show();
}
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(getContext(), "失败:" + t.getMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(getContext(), "取消了", Toast.LENGTH_LONG).show();
}
};
private void tongYi() {
SpannableString spannableString = new SpannableString(getString(R.string.login_licence));
//1 你要更换的颜色 2 3 字符串第几个个数到几个 4 没研究明白
spannableString.setSpan(new URLSpan("www.baidu.com"),8,12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#00a0ff")),8,12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//1 点击事件 2 3 字符串第几个个数到几个 4 没研究明白
spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#00a0ff")),15,19, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//1 点击事件 2 3 字符串第几个个数到几个 4 没研究明白
//不设置的话不会点击 不会动
login_login_tv_license.setMovementMethod(LinkMovementMethod.getInstance());
// 把刚刚写的传给你要操作的字符串
login_login_tv_license.setText(spannableString);
}
}