友盟详情见 https://blog.csdn.net/aijaijgnaw/article/details/84203936
分包
友盟第三方登录
MyApp(Application)
package com.umeng.soexample.app;
import android.app.Application;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.socialize.PlatformConfig;
import com.umeng.socialize.UMShareAPI;
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
UMConfigure.init(this,"5a12384aa40fa3551f0001d1","umeng",UMConfigure.DEVICE_TYPE_PHONE,"");
//打开日志
UMConfigure.setLogEnabled(true);
PlatformConfig.setWeixin("wxdc1e388c3822c80b", "3baf1193c85774b3fd9d18447d76cab0");
PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");
UMShareAPI.get(this);
}
}
注意:要在清单文件中添加
MainActivity
找控件
设置监听
点击事件
设置登录监听
UMAuthListener umAuthListener = new UMAuthListener() {
@Override
public void onStart(SHARE_MEDIA share_media) {
}
@Override
public void onComplete(SHARE_MEDIA share_media, int i, Map<String, String> map) {
//Toast.makeText(MainActivity.this,map.toString(),Toast.LENGTH_SHORT).show();
获取到值(把头像和昵称传入第二个页面)
Map<String, String> login = map;
String screen_name = login.get("screen_name");
String iconurl = login.get("iconurl");
Intent intent = new Intent(MainActivity.this,TwoActivity.class);
intent.putExtra("nick_name",screen_name);
intent.putExtra("iconurl",iconurl);
startActivity(intent);
}
@Override
public void onError(SHARE_MEDIA share_media, int i, Throwable throwable) {
}
@Override
public void onCancel(SHARE_MEDIA share_media, int i) {
}
};
如果需要用QQ登录 要写onActivityResult
//登录QQ使用
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode,resultCode,data);
}
Ok网络请求
package com.umeng.soexample.net;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpNet {
private AccessData accessData;
public OkHttpNet(){}
public OkHttpNet get(String path){
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.get()
.url(path)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//网络请求成功后 得到所有
String string = response.body().string();
accessData.Data(string);
}
});
return this;
}
public interface AccessData{
void Data(String s);
}
public void setAccessData(AccessData accessData) {
this.accessData = accessData;
}
}
登录MVP
MainActivity实现LoginView接口
实现接口后会写入接口内的方法
MainActivity中写入P层
CallBack接口
Model层
package com.umeng.soexample.model;
import com.google.gson.Gson;
import com.umeng.soexample.bean.LoginBean;
import com.umeng.soexample.callback.LoginCallBack;
import com.umeng.soexample.net.OkHttpNet;
public class LoginModel {
public void login(String mobile, String password, final LoginCallBack loginCallBack){
String data = "http://www.zhaoapi.cn/user/login?mobile="+mobile+"&password="+password;
OkHttpNet okHttpNet = new OkHttpNet();
okHttpNet.get(data).setAccessData(new OkHttpNet.AccessData() {
@Override
public void Data(String s) {
Gson gson = new Gson();
LoginBean loginBean = gson.fromJson(s,LoginBean.class);
if(loginBean.getCode().equals("0")){
loginCallBack.onLoginSuccess("登陆成功");
//跳转
}else{
loginCallBack.onLoginFailure("登录失败");
}
}
});
}
}
View层
Presenter层
package com.umeng.soexample.presenter;
import com.umeng.soexample.callback.LoginCallBack;
import com.umeng.soexample.model.LoginModel;
import com.umeng.soexample.view.LoginView;
public class LoginPresenter {
private LoginView loginView;
private final LoginModel loginModel;
public LoginPresenter(LoginView loginView) {
this.loginView = loginView;
loginModel = new LoginModel();
}
public void login(String mobile,String password){
loginModel.login(mobile, password, new LoginCallBack() {
@Override
public void onLoginSuccess(String result) {
loginView.onSuccess(result);
}
@Override
public void onLoginFailure(String msg) {
loginView.onFailure(msg);
}
});
}
}
TwoActivity中
接收第三方登录成功后传过来的值并展示
实现V层后会有两个方法(成功和失败)
@Override
public void showSuccess(final List<ShowBean.DataBean> list) {
//成功后更换线程
runOnUiThread(new Runnable() {
@Override
public void run() {
//展示适配器
adapter = new ShowAdapter(TwoActivity.this,list);
//设置适配器
recyclerView.setAdapter(adapter);
//瀑布流展示
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));
adapter.setOnRecyclerViewItemClick(new ShowAdapter.OnRecyclerViewItemClick() {
@Override
public void onItemClick(View view, int position) {
Intent intent = new Intent(TwoActivity.this,ThreeActivity.class);
intent.putExtra("image",list.get(position).getThumbnail_pic_s());
startActivity(intent);
}
});
}
});
}
点击添加和删除
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_add:
adapter.insert(1);
break;
case R.id.bt_del:
adapter.del(1);
break;
}
}
设置适配器
package com.umeng.soexample.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.squareup.picasso.Picasso;
import com.umeng.soexample.R;
import com.umeng.soexample.bean.ShowBean;
import java.util.List;
public class ShowAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
List<ShowBean.DataBean> list;
public ShowAdapter(Context context, List<ShowBean.DataBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.recycler_item, viewGroup, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) {
MyViewHolder holder = (MyViewHolder) viewHolder;
holder.tv_text.setText(list.get(i).getTitle());
Picasso.with(context).load(list.get(i).getThumbnail_pic_s()).into(holder.iv_image);
}
@Override
public int getItemCount() {
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
private final TextView tv_text;
private final ImageView iv_image;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tv_text = itemView.findViewById(R.id.tv_title);
iv_image = itemView.findViewById(R.id.iv_image);
//设置点击事件
if(onRecyclerViewItemClick != null){
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用点击条目的接口
onRecyclerViewItemClick.onItemClick(v,getAdapterPosition());
}
});
}
}
}
//添加
public void insert(int position){
ShowBean.DataBean dataBean = new ShowBean.DataBean();
dataBean.setTitle("芭蕾美图");
dataBean.setThumbnail_pic_s("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1010551629,632409382&fm=200&gp=0.jpg");
list.add(position,dataBean);
notifyItemInserted(position);
}
//删除
public void del(int position){
if(position>list.size()-1){
Toast.makeText(context,"最后一条了",Toast.LENGTH_SHORT).show();
return;
}else{
list.remove(position);
notifyItemRemoved(position);
}
}
//点击条目的接口
public interface OnRecyclerViewItemClick{
void onItemClick(View view,int position);
}
private OnRecyclerViewItemClick onRecyclerViewItemClick;
public void setOnRecyclerViewItemClick(OnRecyclerViewItemClick onRecyclerViewItemClick) {
this.onRecyclerViewItemClick = onRecyclerViewItemClick;
}
}
展示数据
MVP
Model层
package com.umeng.soexample.model;
import com.google.gson.Gson;
import com.umeng.soexample.bean.ShowBean;
import com.umeng.soexample.callback.ShowCallBack;
import com.umeng.soexample.net.OkHttpNet;
import java.util.ArrayList;
import java.util.List;
public class ShowModel {
String data = "http://www.xieast.com/api/news/news.php";
public void show(final ShowCallBack<List> showCallBack){
OkHttpNet okHttpNet = new OkHttpNet();
okHttpNet.get(data).setAccessData(new OkHttpNet.AccessData() {
@Override
public void Data(String s) {
Gson gson = new Gson();
ShowBean showBean = gson.fromJson(s,ShowBean.class);
List<ShowBean.DataBean> data = showBean.getData();
if(showBean.getCode() == 1){
showCallBack.onShowSuccess(data);
}else{
showCallBack.onShowFailure("展示失败");
}
}
});
}
}
View层
Presenter层
package com.umeng.soexample.presenter;
import com.umeng.soexample.bean.ShowBean;
import com.umeng.soexample.callback.ShowCallBack;
import com.umeng.soexample.model.ShowModel;
import com.umeng.soexample.view.ShowView;
import java.util.List;
public class ShowPresenter {
private ShowView showView;
private final ShowModel showModel;
public ShowPresenter(ShowView showView) {
this.showView = showView;
showModel = new ShowModel();
}
public void show(){
showModel.show(new ShowCallBack<List>() {
@Override
public void onShowSuccess(List<ShowBean.DataBean> list) {
showView.showSuccess(list);
}
@Override
public void onShowFailure(String msg) {
showView.failSuccess(msg);
}
});
}
}
ThreeActivity中接收传过来的图片 及属性动画
package com.umeng.soexample.activity;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import com.squareup.picasso.Picasso;
import com.umeng.soexample.R;
public class ThreeActivity extends AppCompatActivity {
private ImageView start_image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_three);
start_image = findViewById(R.id.start_image);
Intent intent = getIntent();
//接收到图片
String image = intent.getStringExtra("image");
//设置图片
Picasso.with(ThreeActivity.this).load(image).into(start_image);
start_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//平移 渐变
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(start_image,"translationX",0f,200f);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(start_image,"alpha",0f,1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(objectAnimator,objectAnimator1);
animatorSet.setDuration(2000);
animatorSet.start();
}
});
}
}