主页面

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开发——项目实例(五)集新闻、音乐、电影于一体的软件(带打包源码)相关推荐

  1. Android开发知识(二十二)LayoutInflater装载xml布局过程的源码解析

    文章目录 前言 LayoutInflater实例 LayoutInflater的装载过程 include 标签解析 merge 标签解析 attachToRoot参数解析 View创建过程 (1)判断 ...

  2. Kivy Android开发教程之 开始构建 Kivy 跨平台应用程序(环境搭建含程序源码)

    本教程包含以下部分: 介绍 安装 Kivy 依赖项 创建安装 Kivy 的虚拟环境 安装 Cython 安装 Kivy 导入 Kivy 创建简单的 Kivy 应用程序 安装 Buildozer 创建 ...

  3. Android开发本地及网络Mp3音乐播放器(二十)歌曲下载完成后通知主界面更新本地音乐

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51448597 项目源码(打赏5积分请点这边):http://download.csdn ...

  4. Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51290181 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现NetM ...

  5. Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51298411 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现网络音乐 ...

  6. Android开发做一个简单的音乐播放器

    Android开发如何做一个简单的音乐播放器,首先我们先要知道用到的知识点有哪些. 1.MediaPlayer:可以播放本地资源.sd卡内存资源以及网络uri资源,在这里我们播放sd卡上的音乐资源. ...

  7. java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 本源 ...

  8. HTML期末大作业~ 大话西游之大圣娶亲电影4页面 ~学生网页设计作业源码(HTML+CSS+JS)

    HTML期末大作业~ 大话西游之大圣娶亲电影4页面 ~学生网页设计作业源码(HTML+CSS+JS) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网 ...

  9. asp毕业设计——基于asp+access的校园新闻发布管理系统设计与实现(毕业论文+程序源码)——新闻发布管理系统

    基于asp+access的校园新闻发布管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的校园新闻发布管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

最新文章

  1. Oracle常用傻瓜问题1000问
  2. myeclipse.ini内存参数设置及其含义
  3. 对Openshift上的Play Framework 2应用进行故障排除
  4. python-魔法方法-attr系列方法
  5. GRAPH ATTENTION NETWORKS 学习翻译
  6. 阐述游戏关卡设计中的色彩理论
  7. js动态添加的元素如何设置点击事件
  8. 家电哥回馈社会 心系老人忙公益
  9. 绝对不可错过的圣诞节H5游戏
  10. ZigBee Dotdot
  11. systemd 介绍
  12. 科普文——浅析拉卡拉支付安全通道建设
  13. How to tame java GC pauses? Surviving 16GiB heap and greater
  14. 人工智能培训就业,主要有什么特点?
  15. Mysql flush privileges
  16. web自动化测试入门篇04——selenium+python基础方法封装
  17. android 视频投屏,USB视频投屏
  18. 使用内连接查询选修了Java程序基础_使用内连接 查询选修了“java程序基础”课程的学生学号、姓名、课程号、课程名和期末成绩_学小易找答案...
  19. mysql8.0连接时长配置_初学者在Mysql8.0连接时的几个常见基本问题
  20. MySQL 关系型数据库设计范式(NF)

热门文章

  1. 机器学习实例matlab,【学习】Matlab14个机器学习实例
  2. 自动感光调节LED灯亮度C语言程序,红外感应LED亮度调节(附单片机程序).doc
  3. Nginx的rewrite操作
  4. Mac 使用 mysqlclient 报错 NameError: name ‘_mysql‘ is not defined
  5. WINDOWS语言包对应关系表
  6. c语言编写克莱姆法则,【整理】高等数学目录
  7. 网站架构和Servlet技术体系架构
  8. 群狼调研完成深圳宝安前海商圈消费者市场调查
  9. 使用Kettle工具进行数据抽取
  10. Objective-C是什么