项目专用MVP(一套完美无瑕的框架)

本篇文章基本仅限于自己使用,先是一个模型,等有时间了我在慢慢加注释以及修改,成为大家公共资源

一、创建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);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值