1、MVP分包分层:Model、View、Presenter三层
2、Okhttp二次封装,OkhttpClient使用单例模式封装并封装GET、POST请求方法
3、 使用Universal-Image-Loader或Glide图片加载框架
4、属性动画完成图一翻牌的效果,图片自定义,定义动画时间为3秒钟,动画结束后自动跳转到图二界面
5、集成Umeng第三方登录功能,并实现QQ登录,登录成功后显示用户信息
6、使用RecyclerView显示数据并设置点击事件,点击后跳转到图四界面并使用WebView显示页面内容,点击分享按钮,使用Umeng分享功能,成功把该页面的链接分享到QQ朋友圈
http://api.tianapi.com/startup/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
1.旋转动画的MainActivity
package com.example.yuekaomoni; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.animation.Animation; import android.view.animation.ScaleAnimation; import android.widget.ImageView; public class MainActivity extends AppCompatActivity { private ImageView my_img1,my_img2; //旋转动画 private ScaleAnimation sa1 = new ScaleAnimation(1,0,1,1, Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_PARENT,0.5f); private ScaleAnimation sa2 = new ScaleAnimation(0,1,1,1,Animation.RELATIVE_TO_PARENT,0.5f, Animation.RELATIVE_TO_PARENT,0.5f); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化数据 init(); //启动动画 my_img1.startAnimation(sa1); } //初始化数据 private void init() { //找到资源控件的ID my_img1 = findViewById(R.id.my_img1); my_img2 = findViewById(R.id.my_img2); //设置两张图片显示与隐藏的切换 img1Visible(); //设置动画执行的时间 sa1.setDuration(1500); sa2.setDuration(1500); //给sa2设置动画监听事件 sa2.setAnimationListener(new Animation.AnimationListener() { //动画效果开始执行前 @Override public void onAnimationStart(Animation animation) {} //动画效果执行完毕 @Override public void onAnimationEnd(Animation animation) { //创建一个意图,实现跳转 Intent intent = new Intent(MainActivity.this,LoginActivity.class); //执行跳转 startActivity(intent); //关闭页面 finish(); } //动画效果重复执行 @Override public void onAnimationRepeat(Animation animation) {} }); //给sa1设置动画监听事件 sa1.setAnimationListener(new Animation.AnimationListener() { //动画效果开始执行前 @Override public void onAnimationStart(Animation animation) {} //动画效果执行完毕 @Override public void onAnimationEnd(Animation animation) { if(my_img1.getVisibility()==View.VISIBLE){ //把图片1的动画设置为空,现在图片1的不需要 my_img1.setAnimation(null); my_img2.setAnimation(sa2); img2Visible(); }else{ my_img2.setAnimation(null); my_img1.setAnimation(sa2); img1Visible(); } } //动画效果重复执行 @Override public void onAnimationRepeat(Animation animation) {} }); } //设置两张图片显示与隐藏的切换 private void img1Visible() { //图片1进行显示V 图片二进行隐藏I my_img1.setVisibility(View.VISIBLE); my_img2.setVisibility(View.INVISIBLE); } private void img2Visible() { //图片1进行隐藏I 图片二进行显示V my_img1.setVisibility(View.INVISIBLE); my_img2.setVisibility(View.VISIBLE); } }
2.M层接口
package com.example.yuekaomoni.model; import com.example.yuekaomoni.presenter.DataPresenter; //创建接口 public interface DataModel { //定义请求数据的方法 //参数:1.数据接口 2.P层接口(用于将获取的数据返回给P层) void getData(String url,DataPresenter presenter); }
3.M层接口的实现类
package com.example.yuekaomoni.model; import com.example.yuekaomoni.presenter.DataPresenter; import com.example.yuekaomoni.utils.OkhtttpUtils; import com.google.gson.Gson; import java.io.IOException; import java.util.List; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; //接口实现类 public class MyDataModel implements DataModel{ //查询请求数据的方法 @Override public void getData(String url, final DataPresenter presenter) { //使用get进行请求 OkhtttpUtils.daGet(url, new Callback() { //失败 @Override public void onFailure(Call call, IOException e) {} //成功 @Override public void onResponse(Call call, Response response) throws IOException { //获取服务器返回的json String json = response.body().string(); //使用Gson进行解析 Gson gson = new Gson(); MyDataBean myDataBean = gson.fromJson(json, MyDataBean.class); //得到解析后的集合 List<MyDataBean.NewslistBean> list = myDataBean.getNewslist(); //调用P层的成功方法 将集合传回P层 presenter.Success(list); } }); } }
4.P层接口
package com.example.yuekaomoni.presenter; import com.example.yuekaomoni.model.MyDataBean; import java.util.List; //创建接口 public interface DataPresenter { //定义成功与失败的方法 void Success(List<MyDataBean.NewslistBean> list); void Error(); }
5.P层接口的实现类
package com.example.yuekaomoni.presenter; import com.example.yuekaomoni.model.MyDataBean; import com.example.yuekaomoni.model.MyDataModel; import com.example.yuekaomoni.view.DataView; import java.util.List; //接口实现类 public class MyDataPresenter implements DataPresenter{ //创建构造器 接收传来的V层,并实例化出M层 DataView dataView; private final MyDataModel model; public MyDataPresenter(DataView dataView) { this.dataView=dataView; //实例化M层 model = new MyDataModel(); } //重写成功的方法 @Override public void Success(List<MyDataBean.NewslistBean> list) { //调用V层接收数据的方法,将数据传给V层 dataView.toBackHome(list); } //重写失败的方法 @Override public void Error() {} //创建接收V层传来url的方法 public void netWork(String url){ //调用M层的请求方法 model.getData(url,this); } }
6.V层的接口
package com.example.yuekaomoni.view; import com.example.yuekaomoni.model.MyDataBean; import java.util.List; //创建接口 public interface DataView { //定义接收数据的方法 void toBackHome(List<MyDataBean.NewslistBean> list); }
7.V层接口的实现类
package com.example.yuekaomoni.view; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.example.yuekaomoni.R; import com.example.yuekaomoni.WebViewActivity; import com.example.yuekaomoni.adapter.MyAdapter; import com.example.yuekaomoni.model.MyDataBean; import com.example.yuekaomoni.presenter.MyDataPresenter; import java.util.List; //接口实现类 public class RecyclerViewActivity extends AppCompatActivity implements DataView,MyAdapter.OnClickListener{ //数据接口 String url = "http://api.tianapi.com/startup/?key=71e58b5b2f930eaf1f937407acde08fe&num=10"; private RecyclerView my_rcv; private MyAdapter myAdapter; private List<MyDataBean.NewslistBean> list; //创建 Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //接收handler传来的数据 (需强转) list = (List<MyDataBean.NewslistBean>) msg.obj; //创建适配器 myAdapter = new MyAdapter(RecyclerViewActivity.this, list); my_rcv.setAdapter(myAdapter); //调用适配器中方法,将V层传给P层 myAdapter.OnClick(RecyclerViewActivity.this); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_view); //找到资源控件的ID my_rcv = findViewById(R.id.my_rcv); //设置布局管理器 my_rcv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); //实例化P层,将url和V层传给P层 MyDataPresenter presenter = new MyDataPresenter(this); presenter.netWork(url); } //重写接收数据的方法 @Override public void toBackHome(List<MyDataBean.NewslistBean> list) { //创建Message对象 将集合保存其中 Message msg = new Message(); msg.obj=list; //发送给handler handler.sendMessage(msg); } //重写点击条目事件 实现跳转页面 展示WebView @Override public void itemOnClick(int position) { //实现跳转到WebView页面 Intent intent = new Intent(RecyclerViewActivity.this,WebViewActivity.class); //传入相应的页面url title dp intent.putExtra("url",list.get(position).getUrl()); intent.putExtra("title",list.get(position).getTitle()); intent.putExtra("dp",list.get(position).getDescription()); //跳转 startActivity(intent); } }
8.OkHtpp的Get、Post封装
package com.example.yuekaomoni.utils; import android.os.Environment; import java.io.File; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; public class OkhtttpUtils { //单例模式,把构造方法进行私有化 public OkhtttpUtils(){}; static OkHttpClient client; public static OkHttpClient getInstance(){ if(client==null){ //添加同步锁,更加安全 synchronized (OkHttpClient.class){ //缓存的地方 File file = new File(Environment.getExternalStorageDirectory(),"cache11"); client=new OkHttpClient().newBuilder() .readTimeout(3000, TimeUnit.SECONDS)//设置读取的超时时间 .connectTimeout(3000,TimeUnit.SECONDS)//设置连接的超时时间 .cache(new Cache(file,10*1024)) .build(); } } return client; } //创建一个get请求的方法 public static void daGet(String url, Callback callback){ //1.拿到OkHttpClient客户端对象 OkHttpClient client=getInstance(); //2.进行请求的操作 Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(callback); } //创建一个post请求的方法 public static void daPost(String url, Map<String,String> parms, Callback callback){ //1.拿到OkHttpClient客户端对象 OkHttpClient client=getInstance(); FormBody.Builder body = new FormBody.Builder(); for (String key:parms.keySet()){ body.add(key,parms.get(key)); } Request request = new Request.Builder() .url(url) .post(body.build()) .build(); client.newCall(request).enqueue(callback); } }
9.适配器
package com.example.yuekaomoni.adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.yuekaomoni.R; import com.example.yuekaomoni.model.MyDataBean; import java.util.List; public class MyAdapter extends RecyclerView.Adapter{ Context context; List<MyDataBean.NewslistBean> list; public MyAdapter(Context context, List<MyDataBean.NewslistBean> list) { this.context=context; this.list=list; } //创建一个实现类 OnClickListener listener; public void OnClick(OnClickListener listener){ this.listener=listener; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //引入条目布局 View view = View.inflate(context, R.layout.rcv_item, null); //创建MyViewHolder 将view传过去 MyViewHolder myViewHolder = new MyViewHolder(view); //返回myViewHolder return myViewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { final MyViewHolder myViewHolder = (MyViewHolder) holder; myViewHolder.rcv_title.setText(list.get(position).getTitle()); myViewHolder.rcv_dp.setText(list.get(position).getDescription()); myViewHolder.rcv_sj.setText(list.get(position).getCtime()); String url = list.get(position).getPicUrl(); Glide.with(context).load(url).into(myViewHolder.rcv_img); //给条目设置点击事件 myViewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //获取条目的下标 int layoutPosition = myViewHolder.getLayoutPosition(); //将下标设置给点击事件 listener.itemOnClick(layoutPosition); } }); } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ private final ImageView rcv_img; private final TextView rcv_title; private final TextView rcv_dp; private final TextView rcv_sj; public MyViewHolder(View view) { super(view); //找到布局中的资源控件 rcv_img = view.findViewById(R.id.rcv_img); rcv_title = view.findViewById(R.id.rcv_title); rcv_dp = view.findViewById(R.id.rcv_dp); rcv_sj = view.findViewById(R.id.rcv_sj); } } //创建接口 public interface OnClickListener{ //定义条目的点击事件 void itemOnClick(int position); } }
10.数据Bean
package com.example.yuekaomoni.model; import java.util.List; public class MyDataBean { /** * code : 200 * msg : success * newslist : [{"ctime":"2017-06-06 16:00","title":"模式思考:为什么星巴克成了印钞机?","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/2017060614515724.jpg","url":"http://www.chinaz.com/start/2017/0606/720004.shtml"},{"ctime":"2017-06-06 16:00","title":"佛学文化社群平台,\u201c般若\u201d要连接寺庙、僧人、善信","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/6363235766401474079822974.jpeg","url":"http://www.chinaz.com/start/2017/0606/720017.shtml"},{"ctime":"2017-06-06 16:00","title":"短视频不再是东北人的天下 \u201c川军\u201d已崛起","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/6363235842103727035736068.png","url":"http://www.chinaz.com/start/2017/0606/720028.shtml"},{"ctime":"2017-06-06 11:00","title":"中国文青创业者的最大金主:远离风口,专注慢公司","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/2017060610250221.jpg","url":"http://www.chinaz.com/start/2017/0606/719534.shtml"},{"ctime":"2017-06-06 10:00","title":"给程序员当经纪人,程序员客栈完成300万元天使轮融资","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/201706060900398654.jpg","url":"http://www.chinaz.com/start/2017/0606/719406.shtml"},{"ctime":"2017-06-06 10:00","title":"经历多次押宝失败的TOM网,可能要因政策原因而彻底断了挣扎","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/6363233672258475907689785.jpeg","url":"http://www.chinaz.com/start/2017/0606/719411.shtml"},{"ctime":"2017-06-05 17:00","title":"网易蜗牛读书:突破付费模式 敲碎纸电隔阂","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0605/201706051550205463.jpg","url":"http://www.chinaz.com/start/2017/0605/718537.shtml"},{"ctime":"2017-06-05 17:00","title":"五年之后,网易新闻为什么彻底放弃了\u201c有态度\u201d?","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0605/201706051600289006.jpg","url":"http://www.chinaz.com/start/2017/0605/718557.shtml"},{"ctime":"2017-06-05 17:00","title":"一年赚了知性女青年7000万元,它却是行业不擅长挣钱的公司","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0605/201706051619455958.jpg","url":"http://www.chinaz.com/start/2017/0605/718595.shtml"},{"ctime":"2017-06-05 15:00","title":"从兴起到洗牌仅用一年!谁让这场全民狂欢戛然而止?","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0605/6363226806028247287344888.jpg","url":"http://www.chinaz.com/start/2017/0605/718364.shtml"}] */ private int code; private String msg; private List<NewslistBean> newslist; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public List<NewslistBean> getNewslist() { return newslist; } public void setNewslist(List<NewslistBean> newslist) { this.newslist = newslist; } public static class NewslistBean { /** * ctime : 2017-06-06 16:00 * title : 模式思考:为什么星巴克成了印钞机? * description : 创业新闻 * picUrl : http://pic.chinaz.com/thumb/2017/0606/2017060614515724.jpg * url : http://www.chinaz.com/start/2017/0606/720004.shtml */ private String ctime; private String title; private String description; private String picUrl; private String url; public String getCtime() { return ctime; } public void setCtime(String ctime) { this.ctime = ctime; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPicUrl() { return picUrl; } public void setPicUrl(String picUrl) { this.picUrl = picUrl; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } }
11.第三方登录的页面
package com.example.yuekaomoni; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.example.yuekaomoni.view.RecyclerViewActivity; import com.umeng.socialize.UMAuthListener; import com.umeng.socialize.UMShareAPI; import com.umeng.socialize.bean.SHARE_MEDIA; import java.util.Map; public class LoginActivity extends AppCompatActivity { private Button login; private Button skip; private TextView name; private TextView gender; private TextView province; private ImageView iconurl; private LinearLayout ll_data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); //找到资源控件的ID login = findViewById(R.id.btn_login);//第三方登录 skip = findViewById(R.id.btn_skip);//跳转 name = findViewById(R.id.log_name);//姓名 gender = findViewById(R.id.log_gender);//性别 province = findViewById(R.id.log_province);//地址 iconurl = findViewById(R.id.log_iconurl);//头像 ll_data = findViewById(R.id.ll_data);//总布局 //点击进行第三方登录 login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //1.获取用户资料可以使用如下接口:SHARE_MEDIA.QQ (此处可以更改QQ扣扣/SINA新浪/WEIXIN微信) UMShareAPI.get(LoginActivity.this).getPlatformInfo(LoginActivity.this, SHARE_MEDIA.QQ, authListener); } }); //点击跳转按钮跳转到RecyclerView显示页面 skip.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(LoginActivity.this,RecyclerViewActivity.class); //启动 startActivity(intent); //关闭页面 finish(); } }); } //3.定义此方法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); UMShareAPI.get(this).onActivityResult(requestCode,resultCode,data); } //2.设置监听 UMAuthListener authListener = new UMAuthListener() { /** * @desc 授权开始的回调 * @param platform 平台名称 */ @Override public void onStart(SHARE_MEDIA platform) { } /** * @desc 授权成功的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 * @param data 用户资料返回 */ @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { Toast.makeText(LoginActivity.this, "成功了", Toast.LENGTH_LONG).show(); if(data!=null){ //未开具进行赋值(数据存在Map集合中) name.setText(data.get("name"));//姓名 gender.setText(data.get("gender"));//性别 province.setText(data.get("province"));//地址 Glide.with(LoginActivity.this).load(data.get("iconurl")).into(iconurl);//头像 ll_data.setVisibility(View.VISIBLE); }else{ ll_data.setVisibility(View.INVISIBLE); } } /** * @desc 授权失败的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 * @param t 错误原因 */ @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { Toast.makeText(LoginActivity.this, "失败:" + t.getMessage(), Toast.LENGTH_LONG).show(); } /** * @desc 授权取消的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 */ @Override public void onCancel(SHARE_MEDIA platform, int action) { Toast.makeText(LoginActivity.this, "取消了", Toast.LENGTH_LONG).show(); } }; }
12.Wed页面的分享
package com.example.yuekaomoni; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.Toast; import com.umeng.socialize.ShareAction; import com.umeng.socialize.UMShareListener; import com.umeng.socialize.bean.SHARE_MEDIA; import com.umeng.socialize.media.UMWeb; public class WebViewActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); //找到资源控件的ID WebView wv = findViewById(R.id.wv); Button share = findViewById(R.id.share); //接收条目传来的url Intent intent = getIntent(); String url = intent.getStringExtra("url"); final String title = intent.getStringExtra("title"); final String dp = intent.getStringExtra("dp"); //设置支持与JavaScript进行交互 wv.getSettings().setJavaScriptEnabled(true); //将url设置在WebView上 wv.loadUrl(url); //设置自己的浏览器 wv.setWebViewClient(new WebViewClient(){ //覆盖shouldOverrideUrlLoading 方法 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); //给分享按钮设置点击事件 share.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //创建分享的标题描述等 UMWeb web = new UMWeb("http:www.baidu.com"); web.setTitle(title);//标题 web.setDescription(dp);//描述 //9.使用分享面板的分享,用户可以调用我们的打开分享面板的方法,点击分享面板的对应平台进行分享 // (不使用分享面板的分享,用户可以自己写分享按钮,或者触发事件,然后调用我们的分享方法,进行分享) new ShareAction(WebViewActivity.this).withMedia(web) .setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN) .setCallback(shareListener).open(); } }); } //手动集成 //1.下载SDK;2.将main文件夹以及platform(选择你想使用的平台即可)文件下,对应的资源文件和jar放入你的工程! //3.在包名目录下创建wxapi文件夹,新建一个名为WXEntryActivity的activity继承WXCallbackActivity。(限用于微信) //4.QQ与新浪不需要添加Activity,但需要在使用QQ分享或者授权的Activity中,添加:(也可省略) // @Override // protected void onActivityResult(int requestCode, int resultCode, Intent data) { // super.onActivityResult(requestCode, resultCode, data); // UMShareAPI.get(this).onActivityResult(requestCode,resultCode,data); // } //10.其中umShareListener为回调监听,构建如下: private UMShareListener shareListener = new UMShareListener() { /** * @descrption 分享开始的回调 * @param platform 平台类型 */ @Override public void onStart(SHARE_MEDIA platform) { } /** * @descrption 分享成功的回调 * @param platform 平台类型 */ @Override public void onResult(SHARE_MEDIA platform) { Toast.makeText(WebViewActivity.this,"成功了",Toast.LENGTH_LONG).show(); } /** * @descrption 分享失败的回调 * @param platform 平台类型 * @param t 错误原因 */ @Override public void onError(SHARE_MEDIA platform, Throwable t) { Toast.makeText(WebViewActivity.this,"失败"+t.getMessage(),Toast.LENGTH_LONG).show(); } /** * @descrption 分享取消的回调 * @param platform 平台类型 */ @Override public void onCancel(SHARE_MEDIA platform) { Toast.makeText(WebViewActivity.this,"取消了",Toast.LENGTH_LONG).show(); } }; }
13.application用于初步配置第三方
package com.example.yuekaomoni; import android.app.Application; import com.umeng.commonsdk.UMConfigure; import com.umeng.socialize.PlatformConfig; public class application extends Application{ //三方的key { PlatformConfig.setWeixin("wx967daebe835fbeac","5bb696d9ccd75a38c8a0bfe0675559b3"); PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba"); PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad","http://sns.whalecloud.com"); } @Override public void onCreate() { super.onCreate(); /** * 初始化common库 * 参数1:上下文,不能为空 * 参数2:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机 * 参数3:Push推送业务的secret */ //8.初始化需要在您的Application中调用我们的初始化接口: UMConfigure.init(this,"5a12384aa40fa3551f0001d1", "umeng", UMConfigure.DEVICE_TYPE_PHONE,"");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0 } }
14.清单文件的配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.yuekaomoni"> <!-- 必须的权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- 推荐的权限 --> <!-- 添加如下权限,以便使用更多的第三方SDK和更精准的统计数据 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:name=".application" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoginActivity" /> <activity android:name=".view.RecyclerViewActivity" /> <activity android:name=".WebViewActivity" /> <activity android:name=".wxapi.WXEntryActivity"></activity> <!-- 配置文件方式初始化appkey和channel --> <meta-data android:name="UMENG_APPKEY" android:value="5ac599ccf43e4822c00003ba" /> <meta-data android:name="UMENG_CHANNEL" android:value="Channel ID" /> <!--5.新浪--> <activity android:name="com.umeng.socialize.media.WBShareCallBackActivity" android:configChanges="keyboardHidden|orientation" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:exported="false" android:screenOrientation="portrait" > </activity> <activity android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity" android:configChanges="keyboardHidden|orientation" android:exported="false" android:windowSoftInputMode="adjustResize" > </activity> <activity android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" android:launchMode="singleTask" android:name="com.sina.weibo.sdk.share.WbShareTransActivity"> <intent-filter> <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <!--6.QQ--> <activity android:name="com.tencent.tauth.AuthActivity" android:launchMode="singleTask" android:noHistory="true" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tencent100424468" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="orientation|keyboardHidden|screenSize"/> <!--微信(暂不可用)--> <!--<activity--> <!--android:name=".wxapi.WXEntryActivity"--> <!--android:configChanges="keyboardHidden|orientation|screenSize"--> <!--android:exported="true"--> <!--android:screenOrientation="portrait"--> <!--android:theme="@android:style/Theme.Translucent.NoTitleBar"/>--> </application> </manifest>
15.条目布局
<?xml version="1.0" encoding="utf-8"?> <FrameLayout 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" tools:context="com.example.yuekaomoni.MainActivity"> <ImageView android:id="@+id/my_img1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/img1"/> <ImageView android:id="@+id/my_img2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/img2" android:visibility="invisible" /> </FrameLayout>
<?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.example.yuekaomoni.LoginActivity"> <Button android:id="@+id/btn_login" android:layout_width="match_parent" android:layout_height="100px" android:text="第三方登录" /> <LinearLayout android:id="@+id/ll_data" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="1" android:orientation="vertical" android:visibility="invisible" android:layout_marginLeft="100px"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10px" android:layout_marginTop="20px"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="昵称:"/> <TextView android:id="@+id/log_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20px" android:text="进一步没资格"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10px" android:layout_marginTop="20px"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="性别:"/> <TextView android:id="@+id/log_gender" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20px" android:text="女"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10px" android:layout_marginTop="20px"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="地址:"/> <TextView android:id="@+id/log_province" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20px" android:text="退一步舍不得"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10px" android:layout_marginTop="20px"> <ImageView android:id="@+id/log_iconurl" android:layout_width="300px" android:layout_height="300px" android:layout_marginLeft="20px" android:src="@mipmap/ic_launcher"/> </LinearLayout> </LinearLayout> <Button android:id="@+id/btn_skip" android:layout_width="match_parent" android:layout_height="100px" android:text="跳转" /> </LinearLayout>
<?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.example.yuekaomoni.view.RecyclerViewActivity"> <TextView android:layout_width="match_parent" android:layout_height="80px" android:text="标题" android:layout_gravity="center" android:gravity="center" android:textSize="28px" android:textStyle="bold" android:background="#ff0"/> <android.support.v7.widget.RecyclerView android:id="@+id/my_rcv" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout>
<?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.example.yuekaomoni.WebViewActivity"> <Button android:id="@+id/share" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="440px" android:text="分享"/> <WebView android:id="@+id/wv" android:layout_width="match_parent" android:layout_height="match_parent"> </WebView> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="20px"> <ImageView android:id="@+id/rcv_img" android:layout_width="100px" android:layout_height="100px" android:src="@mipmap/ic_launcher"/> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20px"> <TextView android:id="@+id/rcv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="短视频不再是东北人的天下"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingTop="20px"> <TextView android:id="@+id/rcv_dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="创业新闻"/> <TextView android:id="@+id/rcv_sj" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2017-06-06 16:00"/> </LinearLayout> </LinearLayout> </LinearLayout> </LinearLayout>