不否认努力,继续加油!
本博客根据尚硅谷项目实战: 北京新闻.学习整理重点、盲区,笔记如下:干干巴巴,麻麻赖赖,一点都不圆润……
day01
这是第一天的学习笔记:链接: 新闻APP01.
day02
内容
1. 根据 RadioButton 切换到对应页面
-
XUtils3 实例化控件
a. 下载并以库的方式进行依赖;
b. 参照文档使用:
//1.把当前View对象注入(View和事件)到XUtils框架中
x.view().inject(this,view);//把当前的视图通过xUtils3注入到 ContentFragment
//2.使用注解的方法找到某个控件;代替findview
@ViewInject(R.id.rg_content_fragment)
private RadioGroup rg_content_fragment;
-
实现主界面各个子页面
a. 各子页面装在正文碎片的 ViewPager 中;各子页面的根布局用 LinearLayout ;上半啦用 RelativeLayout 为布局共用的 TitleBar ;正文部分采用 帧布局 的方式;
b. 将五个页面的公共信息提取出成基类 BasePager ,基类要求子类初始化视图和初始化数据;随后新建各个页面继承自 BasePager; -
使用PagerAdapter绑定各个页面
a. 初始化数据;新建出页面的数组;
b. 新建 adapter;在初始化 item 时;根据位置从basePagers中取出对应的页面,添加到容器中,并返回;
c. 绑定数据;给页面设置自定义的 adapter;
2. 主页面相关问题处理
-
点击 RadioButton 切换到对应页面;
在 ContentFragment.java 的初始化数据方法中;设置 RadioGroup 的监听; -
自定义ViewPager屏蔽滑动;
在实现了 RadioButton 调转页面后,屏蔽原生的 ViewPager 左右滑动事件;自定义 ViewPager ,在 onTouchEvent() 中返回 true;消费掉触摸事件而不作处理; -
屏蔽 ViewPager 数据预加载
a.ViewPager 默认加载两个页面的数据,最多存在三个页面的数据;而APP 各个页面的数据很多,从节约流量和程序流畅度角度来讲,屏蔽其预加载十分必要;
b. 设置 ViewPager 的适配器;在初始化页面时 取消 初始化数据;
c. 那个页面被选中,哪个页面初始化数据;即 onPageSelected() 方法中初始化数据;
d. 默认加载首页;仅仅如此那么打开页面的首页是没有数据的;所以在 正文 初始化数据时,选择“首页”为默认选中,并初始化数据;
-
设置某页面不能拖拽出侧滑菜单;
a. 创建 isEnabledSlidingMenu() 方法;当 flag 是 false 时,设置不能打开侧滑;
b. 在 RadioButton 监听中,当选择某些页面时设置 flag 为false;
3.软件层次介绍
- 软件的层次结构,这是做 APP 最重要的地方,需要总体的思路和认识,软件的架构是对软件整体功能十分清晰后才能做得出来;
- BasePager 是基类;其中最下层还有 选项卡的 框架
4. 新闻中心数据请求&json数据解析
-
配置网络请求数据
a. 服务数据配置并启动服务;安装 TomCat;并将服务器缓存的数据解压到 安装目录\webapps\ROOT 下;本机IP 为192.168.0.5;
b. 创建常量类,里面定义网络访问地址; -
请求网络
a. 定义 getDataFromNet)( ;使用XUtils3的 x.http()请求网络RequestParams params = new RequestParams(ConstantUtils.newscenter_uri); params.addQueryStringParameter("wd", "xUtils"); x.http().get(params, new Callback.CommonCallback<String>() { ……重写方法 }
b. 添加权限
记得加上联网权限<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
c. 使用前注意在 功能清单中配置
public class BeijintNewsApplication extends Application{ @Override public void onCreate() { super.onCreate(); x.Ext.init(this); x.Ext.setDebug(true); // 是否输出debug日志 } } //功能清单文件配置 <application android:name=".BeijintNewsApplication" ........
-
处理和用gson解析数据
a. 定义方法processData(String json)
private void processData(String json) { NewsCenterBean centerBean = parsedJson(json); //把数据传递到左侧菜单 leftMenudata = centerBean.getData(); centerBean.getData().get(0).getChildren().get(2).getTitle()); //把四个页面添加到新闻中心这里 MainActivity mainActivity = (MainActivity) mActivity; detailBasePagers = new ArrayList<>(); detailBasePagers.add(new NewsMenuDetailPager(mainActivity, leftMenudata.get(0).getChildren()));//新闻详情页面 detailBasePagers.add(new TopicMenuDetailPager(mainActivity, leftMenudata.get(0).getChildren()));//专题详情页面 detailBasePagers.add(new PhotosMenuDetailPager(mainActivity));//图组详情页面 detailBasePagers.add(new InteracMenuDetailPager(mainActivity));//互动详情页面 LeftMenuFragment leftMenuFragment = mainActivity.getLeftMenuFragment(); leftMenuFragment.setData(leftMenudata); }
b. 用谷歌工具Gson解析json数据
c. 方法 processData(String json) 具体代码
protected void processData(String json) { Gson gson = new Gson(); NewsCenterBean bean = gson.fromJson(json, NewsCenterBean.class); System.out.println(bean.data.get(0).children.get(0).title); }
5. 给左侧菜单传递数据
-
即通过解析得到的数据,有不同的几个标签,将这几个标签的 title 传到左侧菜单,更新期数据;
-
初始化左侧菜单的数据
在解析数据后,List leftMenuData = bean.data; -
在MainActivtiy中写得到LeftMenuFragment方法;
//在创建 碎片时 就要传入 TAG 值;这里用TAG值进行获取; public LeftMenuFragment getLeftMenuFragment(){ FragmentManager fm = getSupportFragmentManager(); LeftMenuFragment leftMenuFragment = (LeftMenuFragment) fm.findFragmentByTag(LEFT_MEUE_TAG); return leftMenuFragment; }
-
在NewsPager中ProcessData中传递数据
a. 得到LeftMenuFragment;
b. LeftMenuFragment 中接收数据;
c. 传递数据leftMenuFragment.setMenueDataList(leftMenuData);
6. 左侧菜单数据绑定&状态处理
- 创建 ListView & 设置适配器数据
a. ListView 绑定 仅包含 TextView 的 item ;将解析出来的数据的 title 设置为其内容;
b. item 布局;关于 选择器中 “state_checked” 、“state_pressed”、“state_enabled” 三者之间的选择;下文盲区中; - ListView 细节调节
a. 设置背景为黑色:mLitView.setBackgroundColor(Color.BLACK);
b. 解决拖动背景变白色和去除分割线mListView.setCacheColorHint(Color.TRANSPARENT); //在低版本去掉分割线 mListView.setDividerHeight(0); //去掉在低版本中默认选中效果 mListView.setSelector(android.R.color.transparent);
- 设置选择效果
a. 设置文字的选择效果:textView.setEnabled(currentSelectItem ==position);
b. 再点击 item 时刷新 adapter;adapter.notifyDataSetChanged();
c. 点击时菜单隐藏;隐藏就显示,显示就隐藏mainActivity.getSlidingMenu().toggle();
d. 给 menu 按钮同样设置点击控制菜单;
7. 实现左侧菜单切换对应页面
- 初始化菜单对应的页面基类MenuDetailBasePager;子类继承基类并实现初始化视图和数据;
- 添加新闻&专题&图组&互动等详细页面;
a. 新建各子类页面;
b. 在解析网络数据时,添加各详情页面;
c. 在切换各个页面的时候初始化 数据; - 从左侧菜单切换对应的详情页面;
a. 在 MainActivity 中提供得到 ContentFragment 方法;
b. 在ContentFragment中提供得到NewsCenterPager方法;public ContentFragment getContentFragment(){ FragmentManager fm = getSupportFragmentManager(); ContentFragment contentFragment = (ContentFragment) fm.findFragmentByTag(MAIN_MENU_TAG); return contentFragment; }
c. 在LeftMenuFragment类中的setLeftMenuData的方法调用public NewsCenterPager getNewsCenterPager(){ NewsCenterPager newsCenterPager = (NewsCenterPager) basePagers.get(1); return newsCenterPager; }
ContentFragment contentFragment = mainActivity.getContentFragment(); NewsCenterPager newsCenterPager = contentFragment.getNewsCenterPager(); newsCenterPager.switchCurrenPage(position);
- 解决细节问题
a. 切换时改变标题;
b. 设置菜单默认的对应的页面数据;
c. 解决空指针移除-在NewsCenterPager的processData方法;先加载数据,再调用 setLeftMenuData() 方法;
盲区
1. 导入module时的BUG
- 导入module后不可以运行;因为我导入以后 给sample 改名了,而在 项目根目录下的 setting 中,没有 改名后的 module;将 setting 中的 module 名 改一下就好了;
- 在报错
"No version of NDK matched the requested version 20.0.5594570. Versions available locally: 21.0.61136"
时;因为导入的 module 的NDK 比 AS 的第,所以在引入的 module 的 build.gradle 文件的 android{ 中添加ndkVersion "21.0.6113669"
当然其中的版本号是你所需要的版本号; - 报错
“java.lang.reflect.InvocationTargetException”
时,如果代码中有 try - catch ,那么让 catch Exception 试试;如果不好使,就仔细看报错内容中的“Caused by: java.lang.……”
很有可能是导入的 module 中很多控件的依赖过期,需要重新添加控件标签如 ViewPafer、CoordinateLayout等;
2. 小技巧
- 布局中的按钮,如果导入还有背景图;可以
" android:background="@android:color/transparent"
将其设置为透明; - 选择器中 “state_checked” 、“state_pressed”、“state_enabled” 三者之间的选择;RadioButton 中的 Button 一般使用 “state_checked”,按钮 Button 一般使用 “state_pressed”,此处,点击后即选中对应页面,并且持续保持 选中状态,故使用的是"state_enabled" ;
转载:https://blog.csdn.net/liusaisaiV1/article/details/105888123