RadioButton 切换到对应页面 & 数据请求&json数据解析 & 左侧菜单和主页面传递数据—Android项目实战—新闻APP02

项目实战:新闻APPday02学习笔记

  • day02
    • 内容
      • 1. 根据 RadioButton 切换到对应页面
      • 2. 主页面相关问题处理
      • 3.软件层次介绍
      • 4. 新闻中心数据请求&json数据解析
      • 5. 给左侧菜单传递数据
      • 6. 左侧菜单数据绑定&状态处理
      • 7. 实现左侧菜单切换对应页面
    • 盲区
      • 1. 导入module时的BUG
      • 2. 小技巧
  • 其他笔记
    • 新闻APP其他笔记
    • 购物商城APP学习笔记

不否认努力,继续加油!
学习整理重点、盲区,笔记如下:干干巴巴,麻麻赖赖,一点都不圆润……

day02

内容

1. 根据 RadioButton 切换到对应页面

  1. 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;
    
  2. 实现主界面各个子页面

    a. 各子页面装在正文碎片的 ViewPager 中;各子页面的根布局用 LinearLayout ;上半啦用 RelativeLayout 为布局共用的 TitleBar ;正文部分采用 帧布局 的方式;
    RadioButton 切换到对应页面 & 数据请求&json数据解析 & 左侧菜单和主页面传递数据—Android项目实战—新闻APP02_第1张图片
    b. 将五个页面的公共信息提取出成基类 BasePager ,基类要求子类初始化视图和初始化数据;随后新建各个页面继承自 BasePager;

  3. 使用PagerAdapter绑定各个页面

    a. 初始化数据;新建出页面的数组;

    b. 新建 adapter;在初始化 item 时;根据位置从basePagers中取出对应的页面,添加到容器中,并返回;

    c. 绑定数据;给页面设置自定义的 adapter;

2. 主页面相关问题处理

  1. 点击 RadioButton 切换到对应页面;
    在 ContentFragment.java 的初始化数据方法中;设置 RadioGroup 的监听;

  2. 自定义ViewPager屏蔽滑动;
    在实现了 RadioButton 调转页面后,屏蔽原生的 ViewPager 左右滑动事件;自定义 ViewPager ,在 onTouchEvent() 中返回 true;消费掉触摸事件而不作处理;

  3. 屏蔽 ViewPager 数据预加载

    a.ViewPager 默认加载两个页面的数据,最多存在三个页面的数据;而APP 各个页面的数据很多,从节约流量和程序流畅度角度来讲,屏蔽其预加载十分必要;

    b. 设置 ViewPager 的适配器;在初始化页面时 取消 初始化数据;

    c. 那个页面被选中,哪个页面初始化数据;即 onPageSelected() 方法中初始化数据;

    d. 默认加载首页;仅仅如此那么打开页面的首页是没有数据的;所以在 正文 初始化数据时,选择“首页”为默认选中,并初始化数据;

  4. 设置某页面不能拖拽出侧滑菜单;

    a. 创建 isEnabledSlidingMenu() 方法;当 flag 是 false 时,设置不能打开侧滑;

    b. 在 RadioButton 监听中,当选择某些页面时设置 flag 为false;

3.软件层次介绍

  1. 软件的层次结构,这是做 APP 最重要的地方,需要总体的思路和认识,软件的架构是对软件整体功能十分清晰后才能做得出来;
  2. BasePager 是基类;其中最下层还有 选项卡的 框架
    RadioButton 切换到对应页面 & 数据请求&json数据解析 & 左侧菜单和主页面传递数据—Android项目实战—新闻APP02_第2张图片

4. 新闻中心数据请求&json数据解析

  1. 配置网络请求数据

    a. 服务数据配置并启动服务;安装 TomCat;并将服务器缓存的数据解压到 安装目录\webapps\ROOT 下;本机IP 为192.168.0.5;
    b. 创建常量类,里面定义网络访问地址;

  2. 请求网络
    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"
    	........
    
  3. 处理和用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. 给左侧菜单传递数据

  1. 即通过解析得到的数据,有不同的几个标签,将这几个标签的 title 传到左侧菜单,更新期数据;

  2. 初始化左侧菜单的数据
    在解析数据后,List leftMenuData = bean.data;

  3. 在MainActivtiy中写得到LeftMenuFragment方法;

    //在创建 碎片时 就要传入 TAG 值;这里用TAG值进行获取;
    public LeftMenuFragment getLeftMenuFragment(){
    	FragmentManager fm = getSupportFragmentManager();
       	LeftMenuFragment leftMenuFragment = (LeftMenuFragment) fm.findFragmentByTag(LEFT_MEUE_TAG);
         return leftMenuFragment;
    }
    
  4. 在NewsPager中ProcessData中传递数据
    a. 得到LeftMenuFragment;
    b. LeftMenuFragment 中接收数据;
    c. 传递数据 leftMenuFragment.setMenueDataList(leftMenuData);

6. 左侧菜单数据绑定&状态处理

  1. 创建 ListView & 设置适配器数据

    a. ListView 绑定 仅包含 TextView 的 item ;将解析出来的数据的 title 设置为其内容;

    b. item 布局;关于 选择器中 “state_checked” 、“state_pressed”、“state_enabled” 三者之间的选择;下文盲区中;

  2. ListView 细节调节

    a. 设置背景为黑色:mLitView.setBackgroundColor(Color.BLACK);

    b. 解决拖动背景变白色和去除分割线

    mListView.setCacheColorHint(Color.TRANSPARENT);
    //在低版本去掉分割线
     mListView.setDividerHeight(0);
    //去掉在低版本中默认选中效果
     mListView.setSelector(android.R.color.transparent);
    
  3. 设置选择效果

    a. 设置文字的选择效果:textView.setEnabled(currentSelectItem ==position);

    b. 再点击 item 时刷新 adapter;adapter.notifyDataSetChanged();

    c. 点击时菜单隐藏;隐藏就显示,显示就隐藏mainActivity.getSlidingMenu().toggle();

    d. 给 menu 按钮同样设置点击控制菜单;

7. 实现左侧菜单切换对应页面

  1. 初始化菜单对应的页面基类MenuDetailBasePager;子类继承基类并实现初始化视图和数据;

  2. 添加新闻&专题&图组&互动等详细页面;

    a. 新建各子类页面;

    b. 在解析网络数据时,添加各详情页面;

    c. 在切换各个页面的时候初始化 数据;

  3. 从左侧菜单切换对应的详情页面;

    a. 在 MainActivity 中提供得到 ContentFragment 方法;

    public ContentFragment getContentFragment(){
         FragmentManager fm = getSupportFragmentManager();
         ContentFragment contentFragment = (ContentFragment) fm.findFragmentByTag(MAIN_MENU_TAG);
         return contentFragment;
    }
    

    b. 在ContentFragment中提供得到NewsCenterPager方法;

    public NewsCenterPager getNewsCenterPager(){
         NewsCenterPager newsCenterPager = (NewsCenterPager) basePagers.get(1);
         return newsCenterPager;
    }
    

    c. 在LeftMenuFragment类中的setLeftMenuData的方法调用

    ContentFragment contentFragment = mainActivity.getContentFragment();
    NewsCenterPager newsCenterPager = contentFragment.getNewsCenterPager();
    newsCenterPager.switchCurrenPage(position);
    
  4. 解决细节问题

    a. 切换时改变标题;

    b. 设置菜单默认的对应的页面数据;

    c. 解决空指针移除-在NewsCenterPager的processData方法;先加载数据,再调用 setLeftMenuData() 方法;

盲区

1. 导入module时的BUG

  1. 导入module后不可以运行;因为我导入以后 给sample 改名了,而在 项目根目录下的 setting 中,没有 改名后的 module;将 setting 中的 module 名 改一下就好了;
  2. 在报错"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"当然其中的版本号是你所需要的版本号;
  3. 报错“java.lang.reflect.InvocationTargetException”时,如果代码中有 try - catch ,那么让 catch Exception 试试;如果不好使,就仔细看报错内容中的“Caused by: java.lang.……”很有可能是导入的 module 中很多控件的依赖过期,需要重新添加控件标签如 ViewPafer、CoordinateLayout等;

2. 小技巧

  1. 布局中的按钮,如果导入还有背景图;可以" android:background="@android:color/transparent" 将其设置为透明;
  2. 选择器中 “state_checked” 、“state_pressed”、“state_enabled” 三者之间的选择;RadioButton 中的 Button 一般使用 “state_checked”,按钮 Button 一般使用 “state_pressed”,此处,点击后即选中对应页面,并且持续保持 选中状态,故使用的是"state_enabled" ;

声明:本博客根据尚硅谷项目实战: 北京新闻.学习整理;

其他笔记

新闻APP其他笔记

  1. day01
    第一天的学习笔记: 新闻APP01.
  2. day02
    第二天的学习笔记: 新闻APP02.
  3. day03
    第三天的学习笔记: 新闻APP03.
  4. day04
    第四天的学习笔记: 新闻APP04.
  5. day05
    第五天的学习笔记: 新闻APP05.
  6. day06
    第六天的学习笔记:新闻APP06.
  7. day07
    第七天的学习笔记:新闻APP07.

购物商城APP学习笔记

购物商城APP学习笔记:购物商城

你可能感兴趣的:(Android学习总结)