1.服务器位置:tomcat--webapp-Root---
2.Json格式化工具:HiJson
3.网络连接的URl放在一个类中,方便管理(放在一个独立的包下)
<span style="font-size:14px;">/**
* 定义全局参数
*
* @author Kevin
*
*/
public class GlobalContants {
public static final String SERVER_URL = "http://10.0.2.2:8080/zhbj";
public static final String CATEGORIES_URL = SERVER_URL + "/categories.json";// 获取分类信息的接口
}</span>
4.从服务器获取数据
开源框架:XUtils
需要权限:
<span style="font-size:14px;"> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></span>
<span style="font-size:14px;"> /**
* 从服务器获取数据
*/
private void getDataFromServer() {
HttpUtils utils = new HttpUtils();
// 使用xutils发送请求
utils.send(HttpMethod.GET, GlobalContants.CATEGORIES_URL,
new RequestCallBack<String>() { //返还的Json数据为String,如果是文件就是File
// 访问成功
@Override
public void onSuccess(ResponseInfo responseInfo) {
String result = (String) responseInfo.result;
System.out.println("返回结果:" + result);
parseData(result); //解析网络数据
}
// 访问失败
@Override
public void onFailure(HttpException error, String msg) {
Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
.show();
error.printStackTrace();
}
});
}</span>
5.使用Gson解析Json
(1)写一个javabean接收解析结果
包名一般为domain
javabean严格按照Json中结构命名,字段名要完全一致,Gson是按照名称存放数据的
<span style="font-size:14px;">{
"data": [
{
"children": [
{
"id": 10007,
"title": "北京",
"type": 1,
"url": "/10007/list_1.json"
},
{
"id": 10006,
"title": "中国",
"type": 1,
"url": "/10006/list_1.json"
},
{
"id": 10008,
"title": "国际",
"type": 1,
"url": "/10008/list_1.json"
},
{
"id": 10010,
"title": "体育",
"type": 1,
"url": "/10010/list_1.json"
},
{
"id": 10091,
"title": "生活",
"type": 1,
"url": "/10091/list_1.json"
},
{
"id": 10012,
"title": "旅游",
"type": 1,
"url": "/10012/list_1.json"
},
{
"id": 10095,
"title": "科技",
"type": 1,
"url": "/10095/list_1.json"
},
{
"id": 10009,
"title": "军事",
"type": 1,
"url": "/10009/list_1.json"
},
{
"id": 10093,
"title": "时尚",
"type": 1,
"url": "/10093/list_1.json"
},
{
"id": 10011,
"title": "财经",
"type": 1,
"url": "/10011/list_1.json"
},
{
"id": 10094,
"title": "育儿",
"type": 1,
"url": "/10094/list_1.json"
},
{
"id": 10105,
"title": "汽车",
"type": 1,
"url": "/10105/list_1.json"
}
],
"id": 10000,
"title": "新闻",
"type": 1
},
{
"id": 10002,
"title": "专题",
"type": 10,
"url": "/10006/list_1.json",
"url1": "/10007/list1_1.json"
},
{
"id": 10003,
"title": "组图",
"type": 2,
"url": "/10008/list_1.json"
},
{
"dayurl": "",
"excurl": "",
"id": 10004,
"title": "互动",
"type": 3,
"weekurl": ""
}
],
"extend": [
10007,
10006,
10008,
10014,
10012,
10091,
10009,
10010,
10095
],
"retcode": 200
}</span>
a.使用HiJson工具了解Json结构
*:数组一般用ArrayList表示
*:String可以接收Int型
*:解析不到就置空
*:原则:首先定义一个类,如果是数组就用ArrayList,否则就是对象
bean:
<span style="font-size:14px;">/**
* 网络分类信息的封装
*
* 字段名字必须和服务器返回的字段名一致, 方便gson解析
*
* @author Kevin
*
*/
public class NewsData {
public int retcode;
public ArrayList<NewsMenuData> data;
// 侧边栏数据对象
public class NewsMenuData {
public String id;
public String title;
public int type;
public String url;
public ArrayList<NewsTabData> children;
@Override
public String toString() {
return "NewsMenuData [title=" + title + ", children=" + children
+ "]";
}
}
// 新闻页面下11个子页签的数据对象
public class NewsTabData {
public String id;
public String title;
public int type;
public String url;
@Override
public String toString() {
return "NewsTabData [title=" + title + "]";
}
}
@Override
public String toString() {
return "NewsData [data=" + data + "]";
}
}
</span>
(2)解析,使用开源框架Gson
临时代码:
<span style="font-size:14px;"> /**
* 解析网络数据
*
* @param result
*/
protected void parseData(String result) {
Gson gson = new Gson();
mNewsData = gson.fromJson(result, NewsData.class);
System.out.println("解析结果:" + mNewsData);
}
</span>
6.不同Fragment中传递数据
(1)定义第一个fragment时获取getActivity----对应的activity对象
并标记对应的fragment
<span style="font-size:14px;">transaction.replace(R.id.fl_left_menu, new LeftMenuFragment(),
FRAGMENT_LEFT_MENU);// 用fragment替换framelayout
transaction.replace(R.id.fl_content, new ContentFragment(),
FRAGMENT_CONTENT);</span>
通过activity对象的传递,可以在不同fragment中传递数据,中枢纽带为该Activity
通过标记获得对应fragment
<span style="font-size:14px;"> // 获取主页面fragment
public ContentFragment getContentFragment() {
FragmentManager fm = getSupportFragmentManager();
ContentFragment fragment = (ContentFragment) fm
.findFragmentByTag(FRAGMENT_CONTENT);
return fragment;
}</span>
<span style="font-size:14px;"> // 刷新测边栏的数据
MainActivity mainUi = (MainActivity) mActivity;
LeftMenuFragment leftMenuFragment = mainUi.getLeftMenuFragment();
leftMenuFragment.setMenuData(mNewsData);</span>
7.点击listview某个item时,保持不变,状态选择器
<span style="font-size:14px;"><selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:color="#f00"/>
<item android:color="@android:color/white"/>
</selector></span>
8.点击侧边栏切换(新闻中)
基类BaseMenuDetailPager
<span style="font-size:14px;">/**
* 菜单详情页基类
*
* @author Kevin
*
*/
public abstract class BaseMenuDetailPager {
public Activity mActivity;
public View mRootView;// 根布局对象
public BaseMenuDetailPager(Activity activity) {
mActivity = activity;
mRootView = initViews();
}
/**
* 初始化界面
*/
public abstract View initViews();
/**
* 初始化数据
*/
public void initData() {
}
}</span>
----------------------------------------------简单版-------详细见下-----------------------(1)新闻 NewsMenuDetailPager
<span style="font-size:14px;">/**
* 菜单详情页-新闻
*
* @author Kevin
*
*/
public class NewsMenuDetailPager extends BaseMenuDetailPager {
public InteractMenuDetailPager(Activity activity) {
super(activity);
}
@Override
public View initViews() {
TextView text = new TextView(mActivity);
text.setText("菜单详情页-新闻");
text.setTextColor(Color.RED);
text.setTextSize(25);
text.setGravity(Gravity.CENTER);
return text;
}
}</span>
(2)互动 InteractMenuDetailPager
<span style="font-size:14px;">/**
* 菜单详情页-互动
*
* @author Kevin
*
*/
public class InteractMenuDetailPager extends BaseMenuDetailPager {
public InteractMenuDetailPager(Activity activity) {
super(activity);
}
@Override
public View initViews() {
TextView text = new TextView(mActivity);
text.setText("菜单详情页-互动");
text.setTextColor(Color.RED);
text.setTextSize(25);
text.setGravity(Gravity.CENTER);
return text;
}
}</span>
(3)组图 PhotoMenuDetailPager
<span style="font-size:14px;">/**
* 菜单详情页-组图
*
* @author Kevin
*
*/
public class PhotoMenuDetailPager extends BaseMenuDetailPager {
public PhotoMenuDetailPager(Activity activity) {
super(activity);
}
@Override
public View initViews() {
TextView text = new TextView(mActivity);
text.setText("菜单详情页-组图");
text.setTextColor(Color.RED);
text.setTextSize(25);
text.setGravity(Gravity.CENTER);
return text;
}
}
</span>
(4)专题 TopicMenuDetailPager
<span style="font-size:14px;">/**
* 菜单详情页-专题
*
* @author Kevin
*
*/
public class TopicMenuDetailPager extends BaseMenuDetailPager {
public TopicMenuDetailPager(Activity activity) {
super(activity);
}
@Override
public View initViews() {
TextView text = new TextView(mActivity);
text.setText("菜单详情页-专题");
text.setTextColor(Color.RED);
text.setTextSize(25);
text.setGravity(Gravity.CENTER);
return text;
}
}</span>
(5)NewCenterPager中的FramLayout填充对应的view
<span style="font-size:14px;"> private ArrayList<BaseMenuDetailPager> mPagers;// 4个菜单详情页的集合
// 准备4个菜单详情页
mPagers = new ArrayList<BaseMenuDetailPager>();
mPagers.add(new NewsMenuDetailPager(mActivity,
mNewsData.data.get(0).children));
mPagers.add(new TopicMenuDetailPager(mActivity));
mPagers.add(new PhotoMenuDetailPager(mActivity));
mPagers.add(new InteractMenuDetailPager(mActivity));
setCurrentMenuDetailPager(0);// 设置菜单详情页-新闻为默认当前页
/**
* 设置当前菜单详情页,----------------在Left_fragment中调用
*/
public void setCurrentMenuDetailPager(int position) {
BaseMenuDetailPager pager = mPagers.get(position);// 获取当前要显示的菜单详情页
flContent.removeAllViews();// 清除之前的布局
flContent.addView(pager.mRootView);// 将菜单详情页的布局设置给帧布局
// 设置当前页的标题
NewsMenuData menuData = mNewsData.data.get(position);
tvTitle.setText(menuData.title);
pager.initData();// 初始化当前页面的数据
}</span>
在left_fragment中横跨几个fragment调用NewsCenterPager-------------------MainActivity为中枢
left_fragment:
/**
* 设置当前菜单详情页
*
* @param position
*/
protected void setCurrentMenuDetailPager(int position) {
MainActivity mainUi = (MainActivity) mActivity;
ContentFragment fragment = mainUi.getContentFragment();// 获取主页面fragment
NewsCenterPager pager = fragment.getNewsCenterPager();// 获取新闻中心页面
pager.setCurrentMenuDetailPager(position);// 设置当前菜单详情页
}
MainActivity中:有标记
// 获取主页面fragment
public ContentFragment getContentFragment() {
FragmentManager fm = getSupportFragmentManager();
ContentFragment fragment = (ContentFragment) fm
.findFragmentByTag(FRAGMENT_CONTENT);
return fragment;
}
ContentFragment中:
/**
* 获取新闻中心页面
*
* @return
*/
public NewsCenterPager getNewsCenterPager() {
return (NewsCenterPager) mPagerList.get(1);
}
成功调用
9.隐藏菜单
private void toggleSlidingMenu() {
MainActivity mainUi = (MainActivity) mActivity;
SlidingMenu slidingMenu = mainUi.getSlidingMenu();
slidingMenu.toggle();// 切换状态, 显示时隐藏, 隐藏时显示
}
10. 新闻中心中的新闻(详细)
(1)添加一个ViewPager
public class NewsMenuDetailPager extends BaseMenuDetailPager {
private ViewPager mViewPager;
private ArrayList<TabDetailPager> mPagerList;
private ArrayList<NewsTabData> mNewsTabData;// 页签网络数据
public NewsMenuDetailPager(Activity activity,
ArrayList<NewsTabData> children) {
super(activity);
mNewsTabData = children;
}
@Override
public View initViews() {
View view = View.inflate(mActivity, R.layout.news_menu_detail, null);
mViewPager = (ViewPager) view.findViewById(R.id.vp_menu_detail);
return view;
}
@Override
public void initData() {
mPagerList = new ArrayList<TabDetailPager>();
// 初始化页签数据
for (int i = 0; i < mNewsTabData.size(); i++) {
TabDetailPager pager = new TabDetailPager(mActivity, mNewsTabData.get(i));
mPagerList.add(pager);
}
mViewPager.setAdapter(new MenuDetailAdapter());
}
class MenuDetailAdapter extends PagerAdapter {
@Override
public int getCount() {
return mPagerList.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
TabDetailPager pager = mPagerList.get(position);
container.addView(pager.mRootView);
pager.initData();
return pager.mRootView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
}
(2)在ViewPager中添加若干个view