Android开发——项目实例(五)集新闻、音乐、电影于一体的软件(带打包源码)
主页面
1.写界面
很明显,这个主界面采用了ViewPager和TabLayout实现界面滑动切换,在使用TabLayout之前记得导包,TabLayout需要导入的包。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!--标题区--><android.support.design.widget.TabLayoutandroid:id="@+id/tab_layout"android:layout_width="match_parent"android:layout_height="wrap_content"app:tabGravity="fill"app:tabMode="fixed"android:background="#e67bab"app:tabTextColor="#fff"app:tabIndicatorColor="#92dfd1"app:tabSelectedTextColor="#1f67e2"></android.support.design.widget.TabLayout><!--页面显示区--><android.support.v4.view.ViewPagerandroid:id="@+id/view_pager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout>
2.写Activity
登录后的主页面* 前提:TabLayout依赖的design包* 属性:①TabLayout、ViewPager* 操作: 1.初始化一个适配器类* 1. 定义标题和页面列表* 2. 把三个Fragment添加到列表中* 3. 用列表和标题创建适配器* 2. 进行关联操作* 1. ViewPager添加适配器* 2. TabLayout与ViewPager关联
package com.example.tablayoutmenu;import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import java.util.ArrayList;
import java.util.List;/*** 登录后的主页面* 前提:TabLayout依赖的design包* 属性:①TabLayout、ViewPager* 操作: 1.初始化一个适配器类* 1. 定义标题和页面列表* 2. 把三个Fragment添加到列表中* 3. 用列表和标题创建适配器* 2. 进行关联操作* 1. ViewPager添加适配器* 2. TabLayout与ViewPager关联** @author thinkdoor*/public class MainActivity extends AppCompatActivity {/*定义UI组件*/private TabLayout tabLayout;private ViewPager viewPager;/*** 创建的回调方法** @param savedInstanceState*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化界面组件tabLayout = (TabLayout) findViewById(R.id.tab_layout);viewPager = (ViewPager) findViewById(R.id.view_pager);//获取初始化的适配器MyFragmentPagerAdapter myFragmentPagerAdapter = init();//添加适配器viewPager.setAdapter(myFragmentPagerAdapter);//设置tablayou和viewpage关联tabLayout.setupWithViewPager(viewPager);}/*** 初始化适配器** @return:初始化后的适配器*/public MyFragmentPagerAdapter init() {//菜单标题String[] title = {"新闻", "音乐", "电影"};//创建装载Fragment的列表List<Fragment> fragmentlist;/*初始化列表,并把创建的三个Fragment页面添加到列表中*/fragmentlist = new ArrayList<>();fragmentlist.add(new FragmentOne());fragmentlist.add(new FragmentTwo());fragmentlist.add(new FragmentThree());//创建Fragment适配器MyFragmentPagerAdapter myFragmentPagerAdapter;//适配器进行适配,传入列表与标题myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),fragmentlist, title);return myFragmentPagerAdapter;}
}
3.前面提到了FragmentOne,FragmentTwo,FragmentThree直接创建先放着,记得继承Fragment奥。
4.创建适配器MyFragmentPagerAdpter
fragment的适配器类* 1.集成FragmentPagerAdapter,实现相关方法* 2.创建需要显示的List集合* 3.重写getPageTitle设置标题
package com.example.tablayoutmenu;import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;import java.util.List;/*** fragment的适配器类* 1.集成FragmentPagerAdapter,实现相关方法* 2.创建需要显示的List集合* 3.重写getPageTitle设置标题** @author thinkdoor*/public class MyFragmentPagerAdapter extends FragmentPagerAdapter {//装载fragment的列表private List<Fragment> list;//标题private String[] title;/*** 构造方法** @param fm* @param list:装载fragment的列表* @param title:标题栏*/public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> list, String[] title) {super(fm);this.list = list;this.title = title;}/*** 返回当前位置的fragment** @param position:当前页面的位置* @return*/@Overridepublic Fragment getItem(int position) {return list.get(position);}/*** 获取list中fragment的个数** @return*/@Overridepublic int getCount() {return list.size();}/*** 返回当前的标题** @param position:当前页面的位置* @return*/@Overridepublic CharSequence getPageTitle(int position) {return title[position];}
}
OK了,现在,我们已经可以实现界面滑动了,但是每个Fragment页面里都是空空的。
好了,现在,来点刺激的,写能显示新闻列表的的FragmentOne。
新闻页面
新闻页面能显示新闻列表,点击新闻进入新闻详情页面
分析——①关于新闻页面使用的是ListView,②然后有ListView就肯定有item的布局还有适配器,③点击进入详情就是设置了Onclick方法,④新闻详情页面博主是用WebView实现的。⑤数据如何获取?博主调用的知乎日报的API接口。
1.界面
就是一个LsitView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>
2.Activity
新闻页面注:News和NewsInfo都是实体model类,见到不要蒙圈
前提准备:OkHttpClient包、Gson包、联网授权1.属性:ListView、OkHttpClient(网络通信异步请求对象)、List<NewsInfo>列表(NewsInfo是新闻信息的实体类)2.操作:1.OkHttpClient+Handler请求网络,得到响应数据,并封装到List<NewsInfo>列表1).创建Handler,重写handlerMessage方法2).使用OkHttpClient实现网络异步请求1.创建Request对象和OkHttpClient对象2.通过前两个对象创建Call对象3.通过Call的enqueue(Callback)方法来提交异步请求,子线程1.把响应字符串转为json对象2.把json对象转为java对象3.创建Message对象,初始化后传输给Handler3).handlerMessage方法中获取List2.用添加好的List创建列适配器,并添加3.设置监听,点击跳转详情页面1).从list中的对象中获取属性2).通过intent的putExtra设置传输3).完成跳转
package com.example.tablayoutmenu;import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;import com.example.tablayoutmenu.model.News;
import com.example.tablayoutmenu.model.NewsInfo;
import com.example.tablayoutmenu.util.JsonUitl;import org.json.JSONException;
import org.json.JSONObject;import java.io.IOException;
import java.util.List;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;/*** 新闻页面注:News和NewsInfo都是实体model类,见到不要蒙圈
前提准备:OkHttpClient包、Gson包、联网授权1.属性:ListView、OkHttpClient(网络通信异步请求对象)、List<NewsInfo>列表(NewsInfo是新闻信息的实体类)2.操作:1.OkHttpClient+Handler请求网络,得到响应数据,并封装到List<NewsInfo>列表1).创建Handler,重写handlerMessage方法2).使用OkHttpClient实现网络异步请求1.创建Request对象和OkHttpClient对象2.通过前两个对象创建Call对象3.通过Call的enqueue(Callback)方法来提交异步请求,子线程1.把响应字符串转为json对象2.把json对象转为java对象3.创建Message对象,初始化后传输给Handler3).handlerMessage方法中获取List2.用添加好的List创建列适配器,并添加3.设置监听,点击跳转详情页面1).从list中的对象中获取属性2).通过intent的putExtra设置传输3).完成跳转* @author thinkdoor*/
public class FragmentOne extends Fragment implements AdapterView.OnItemClickListener{//日志TAGprivate static final String TAG = "FragmentOne";private ListView listView;//存放新闻信息的列表private List<NewsInfo> data;/*** 1).创建Handler,重写handlerMessage方法*/private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {News news = (News)msg.obj;//3).handlerMessage方法中获取Listdata = news.getStories();List<NewsInfo> data2 = news.getTop_stories();//2.用添加好的List创建列适配器,并给ListView添加适配器listView.setAdapter(new NewsAdapter(data,data2,getContext()));}};/*** 创建视图* @param inflater* @param container* @param savedInstanceState* @return*/@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {//用Fragment_one来填充View视图View view = inflater.inflate(R.layout.fragment_one, container, false);listView = view.findViewById(R.id.list_view);listView.setOnItemClickListener(this);//初始化加载新闻数据initNews();return view;}/*** 加载新闻数据,2).使用OkHttpClient实现网络异步请求*/public void initNews(){//知乎新闻String path = "http://news-at.zhihu.com/api/4/news/latest";//1.创建Request对象和OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().get().url(path).build();//2.通过前两个对象创建Call对象Call call = okHttpClient.newCall(request);//3.通过Call的enqueue(Callback)方法来提交异步请求,子线程call.enqueue(new Callback() {//请求失败@Overridepublic void onFailure(Call call, IOException e) {Log.d(TAG, "onFailure() called with: call = [" + call + "], e = [" + e + "]");}//在子线程中运行的(不能更新UI),请求成功@Overridepublic void onResponse(Call call, Response response) throws IOException {String str = response.body().string();Log.d(TAG, str);try {//1.把响应字符串转为json对象JSONObject jsonObject = new JSONObject(str);//2.把json对象转为java对象News news = (News)JsonUitl.stringToObject(jsonObject.toString(),News.class);Log.d(TAG, news.toString());/**//3.创建Message对象,包装对象后,传输给Handler*/Message message = new Message();message.obj = news;handler.sendMessage(message);} catch (JSONException e) {e.printStackTrace();}}});}/*** 点击列表item显示新闻详情,取出当前点击的记录,传ID到详情页** @param parent* @param view* @param position* @param id*/@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//1).从list中的对象中获取属性NewsInfo newsInfo = data.get(position);Intent intent = new Intent();//2).通过intent的putExtra设置传输intent.putExtra("id",newsInfo.getId());//3).完成跳转intent.setClass(getContext(),NewsDetailActivity.class);startActivity(intent);}
}
新闻界面的ListView的适配器
package com.example.tablayoutmenu;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.example.tablayoutmenu.model.NewsInfo;
import com.example.tablayoutmenu.util.AsyncImageLoader;import java.util.ArrayList;
import java.util.List;/**新闻适配器类1.因为是List的适配器,所以继承BaseAdapter,并实现必要方法2.创建需要的List集合3.重写getView方法实现适配界面* @author thinkdoor*/public class NewsAdapter extends BaseAdapter{private List<NewsInfo> list;//LayoutInflater将布局文件实例化为View对象private LayoutInflater layoutInflater;private AsyncImageLoader asyncImageLoader;public NewsAdapter(List<NewsInfo> list, Context context){this.list = list;layoutInflater = LayoutInflater.from(context);this.asyncImageLoader = new AsyncImageLoader(context);}public NewsAdapter(List<NewsInfo> list1,List<NewsInfo> list2, Context context){this.list = mergeList(list1,list2);layoutInflater = LayoutInflater.from(context);this.asyncImageLoader = new AsyncImageLoader(context);}/*** 两个列表合并的方法** @param list1* @param list2* @return*/public List<NewsInfo> mergeList(List<NewsInfo> list1,List<NewsInfo> list2){List<NewsInfo> list = new ArrayList<>();//遍历列表1,并添加到列表3中for(int i = 0;i < list1.size();i++){NewsInfo newsInfo = list1.get(i);list.add(newsInfo);}//遍历列表2,并把String类型的image转化成String[]类型,然后添加到列表3中for(int i = 0;i < list2.size();i++){NewsInfo newsInfo = list2.get(i);newsInfo.setImages(new String[]{newsInfo.getImage()});list.add(newsInfo);}return list;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//将布局文件实例化为View对象View view = layoutInflater.inflate(R.layout.news_item,null);//从布局取textviewTextView textView = (TextView)view.findViewById(R.id.textView);ImageView imageView = (ImageView)view.findViewById(R.id.imageView);//取当前需要显示的对象NewsInfo newsInfo = list.get(position);//给textview赋值textView.setText(newsInfo.getTitle());//加载图片asyncImageLoader.asyncloadImage(imageView, newsInfo.getImages()[0]);return view;}
}
新闻详情页面
界面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_news_detail"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.tablayoutmenu.NewsDetailActivity"><WebViewandroid:id="@+id/web_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentTop="true"android:layout_alignParentStart="true"/>
</RelativeLayout>
Activity
package com.example.tablayoutmenu;import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;import com.example.tablayoutmenu.model.NewsDetail;
import com.example.tablayoutmenu.util.JsonUitl;import org.json.JSONException;
import org.json.JSONObject;import java.io.IOException;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;/*** 新闻详情页属性:WebView操作:1.初始化页面2.联网请求,得到响应数据,进行处理1.创建Handler,重写handlerMeassage方法2.创建OkHttpClient和Request对象3.创建Call对象4.重写Call#enqueue(Callback)方法1.把返回数据转为json对象2.把json对象转为java对象3.创建Message,发送数据到主线程5.handler处理消息1.得到所需消息2.WebView赋值3.完善结尾*/
public class NewsDetailActivity extends AppCompatActivity {//日志TAGprivate static final String TAG = "NewsDetailActivity";//创建WebViewprivate WebView webView;//创建Handlerprivate Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {NewsDetail newsDetail = (NewsDetail)msg.obj;//用webview加载网页webView.loadUrl(newsDetail.getShare_url());}};/*** 创建页面* @param savedInstanceState*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_news_detail);webView = (WebView) findViewById(R.id.web_view);//设置可以执行JS脚本webView.getSettings().setJavaScriptEnabled(true);//加载数据getNews();}/*** 加载新闻数据*/public void getNews(){//知乎新闻详情String path = "http://news-at.zhihu.com/api/4/news/";Intent intent = getIntent();long id = intent.getLongExtra("id",0);path += id;//1.创建OkHttpClient对象和Request对象OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().get().url(path).build();//2.创建Call对象Call call = okHttpClient.newCall(request);//3.执行请求,访问网络数据call.enqueue(new Callback() {//请求失败@Overridepublic void onFailure(Call call, IOException e) {Log.d(TAG, "onFailure() called with: call = [" + call + "], e = [" + e + "]");}//在子线程中运行的(不能更新UI),请求成功@Overridepublic void onResponse(Call call, Response response) throws IOException {String str = response.body().string();Log.d(TAG, str);try {//1.转换成JSON对象JSONObject jsonObject = new JSONObject(str);//2.通过Gson把json字符串转换成java对象NewsDetail newsDetail= (NewsDetail) JsonUitl.stringToObject(jsonObject.toString(),NewsDetail.class);//3.创建Message,发送消息Message message = new Message();message.obj = newsDetail;handler.sendMessage(message);} catch (JSONException e) {e.printStackTrace();}}});}/*** 关闭页面的完善处理*/@Overrideprotected void onDestroy() {super.onDestroy();if (webView!=null){webView.destroy();}}
}
后面两个页面举一反三
主要是①联网找API获取到数据,②获取到数据后的处理。
音乐界面
电影页面
需要打包源码查看下方链接,源码带详细注释,博主用的IDE是Android Studio
GitHub - Thinkdoor/PractiseSoftware
要是觉得还可以,点个再走吧!求求了~
Android开发——项目实例(五)集新闻、音乐、电影于一体的软件(带打包源码)相关推荐
- Android开发知识(二十二)LayoutInflater装载xml布局过程的源码解析
文章目录 前言 LayoutInflater实例 LayoutInflater的装载过程 include 标签解析 merge 标签解析 attachToRoot参数解析 View创建过程 (1)判断 ...
- Kivy Android开发教程之 开始构建 Kivy 跨平台应用程序(环境搭建含程序源码)
本教程包含以下部分: 介绍 安装 Kivy 依赖项 创建安装 Kivy 的虚拟环境 安装 Cython 安装 Kivy 导入 Kivy 创建简单的 Kivy 应用程序 安装 Buildozer 创建 ...
- Android开发本地及网络Mp3音乐播放器(二十)歌曲下载完成后通知主界面更新本地音乐
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51448597 项目源码(打赏5积分请点这边):http://download.csdn ...
- Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51290181 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现NetM ...
- Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51298411 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现网络音乐 ...
- Android开发做一个简单的音乐播放器
Android开发如何做一个简单的音乐播放器,首先我们先要知道用到的知识点有哪些. 1.MediaPlayer:可以播放本地资源.sd卡内存资源以及网络uri资源,在这里我们播放sd卡上的音乐资源. ...
- java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 本源 ...
- HTML期末大作业~ 大话西游之大圣娶亲电影4页面 ~学生网页设计作业源码(HTML+CSS+JS)
HTML期末大作业~ 大话西游之大圣娶亲电影4页面 ~学生网页设计作业源码(HTML+CSS+JS) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网 ...
- asp毕业设计——基于asp+access的校园新闻发布管理系统设计与实现(毕业论文+程序源码)——新闻发布管理系统
基于asp+access的校园新闻发布管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的校园新闻发布管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...
最新文章
- Oracle常用傻瓜问题1000问
- myeclipse.ini内存参数设置及其含义
- 对Openshift上的Play Framework 2应用进行故障排除
- python-魔法方法-attr系列方法
- GRAPH ATTENTION NETWORKS 学习翻译
- 阐述游戏关卡设计中的色彩理论
- js动态添加的元素如何设置点击事件
- 家电哥回馈社会 心系老人忙公益
- 绝对不可错过的圣诞节H5游戏
- ZigBee Dotdot
- systemd 介绍
- 科普文——浅析拉卡拉支付安全通道建设
- How to tame java GC pauses? Surviving 16GiB heap and greater
- 人工智能培训就业,主要有什么特点?
- Mysql flush privileges
- web自动化测试入门篇04——selenium+python基础方法封装
- android 视频投屏,USB视频投屏
- 使用内连接查询选修了Java程序基础_使用内连接 查询选修了“java程序基础”课程的学生学号、姓名、课程号、课程名和期末成绩_学小易找答案...
- mysql8.0连接时长配置_初学者在Mysql8.0连接时的几个常见基本问题
- MySQL 关系型数据库设计范式(NF)
热门文章
- 机器学习实例matlab,【学习】Matlab14个机器学习实例
- 自动感光调节LED灯亮度C语言程序,红外感应LED亮度调节(附单片机程序).doc
- Nginx的rewrite操作
- Mac 使用 mysqlclient 报错 NameError: name ‘_mysql‘ is not defined
- WINDOWS语言包对应关系表
- c语言编写克莱姆法则,【整理】高等数学目录
- 网站架构和Servlet技术体系架构
- 群狼调研完成深圳宝安前海商圈消费者市场调查
- 使用Kettle工具进行数据抽取
- Objective-C是什么