Android编程权威指南(第3版)这本书是基于Android7.0的,到如今已经过于古老,最新的Android版本已经到10,而这本书的第四版目前还没有正式发售,在最近阅读这本书时,我发现这本书的部分代码已经不适合最新的Android开发,所以写下了这篇文章,将我碰到的坑写下来,帮助现在同样在学习使用这本书的人。

本文所说的环境基于AndroidStudio 3.5,Android SDK 28。

在本书第七章7.3.3(中文第三版109页)中写道

要使用AppCompat支持库,项目必须将其列入依赖关系。打开应用模块下的build.gradle文件。每个项目都有两个build.gradle文件。一个用于整个项目,另一个用于应用模块。我们要编辑的是app/build.gradle文件。

但在最新版的AndroidStudio中,这步是可以跳过的,在Google最新的文档中,建议使用AndroidX代替com.android.support 包

按照官方文档说明 AndroidX 是对 android.support.xxx 包的整理后产物。由于之前的 support 包过于混乱,所以,Google 推出了AndroidX。

由于在后续版本中,会逐步放弃对 support 的升级和维护,所以如果是新的项目建议直接使用AndroidX,如果是旧项目,也建议直接迁移到AndroidX

具体见以下的Google Android文档。

https://developer.android.google.cn/jetpack/androidx

回到正题,最新的Android Studio中会默认引入AndroidX的appcompat包,所以完全不必要进行这一步的操作。

在本书第八章8.3.2使用使用 RecyclerView 中
书中写道

RecyclerView类来自于Google支持库。要使用它,首先要添加RecyclerView依赖库。

这句话是对的,但之后说

找到并选择recyclerview-v7支持库,单击OK按钮完成依赖库添加,

这句话就不使用于Android9.0以上的开发了,就像上文说的,我们应该引入的是AndroidX的支持库,而不是recyclerview-v7

app/build.gradle文件,在 dependencies 中添加以下语句,引入 androidx.recyclerview:recyclerview:1.0.0

implementation 'androidx.recyclerview:recyclerview:1.0.0'

完成后如下

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}

代码清单8-15 在布局文件中添加RecyclerView视图( fragment_crime_list.xml) 的根节点也就不应该是
android.support.v7.widget.RecyclerView

而应该是

androidx.recyclerview.widget.RecyclerView

完整版如下

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/crime_recycler_view"> </androidx.recyclerview.widget.RecyclerView>

还是第八章8.3.4实现 ViewHolder 和 Adapter(中文第三版143页) 中
代码清单8-17定义ViewHolder内部类( CrimeListFragment.java)
原文的代码是下面这段

public class CrimelistFragment extends Fragment {
...
  private class CrimeHolder extends RecyclerView.ViewHolder {
    public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
      super(inflater.inflate(R.layout.list_item_crime, parent, false));
    }
  }
}

如果和我一样使用的是Android Studio的3.5版本的话,你就会发现,Android Studio的的代码自动不全生成的是如下的代码

public class CrimeHolder extends RecyclerView.ViewHolder {
public CrimeHolder(@NonNull View itemView) {
super(itemView);
}
}

明明在书上CrimeHolder构造方法应该是有两个参数的,而Android Studio生存的构造方法只有一个参数。

这是为什么呢,因为Google将实例化 list_item_crime 布局的过程挪到了之后实现 Adapter 的 onCreateViewHolder 方法

在代码清单8-19 武装CrimeAdapter( CrimeListFragment.java) 中,书中的代码如下

private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {
...
  @Override
  public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
    return new CrimeHolder(layoutInflater, parent);
  }
  @Override
  public void onBindViewHolder(CrimeHolder holder, int position) {
  }
  @Override
  public int getItemCount() {
    return mCrimes.size();
  }
}

如果按书中的代码,你会发现滴6行 new CrimeHolder 明显无法通过编译,毕竟看参数就能看出来

那么这段应该怎么写呢?

前文说到 实例化 list_item_crime 布局的过程挪到了之后实现 Adapter 的 onCreateViewHolder 方法,也就是说,我们需要做的就是将书中原本在 CrimeHolder 实例化 list_item_crime 的过程挪到 onCreateViewHolder 方法之中

具体代码如下:

     @NonNull
@Override
public CrimeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.list_item_crime, parent, false);
return new CrimeHolder(view);
}

未完待续。。。

ps:本人也在学习这本书,目前的进度就到这里,以后发现新的问题再补充。

使用最新AndroidStudio编写Android编程权威指南(第3版)中的代码会遇到的一些问题的更多相关文章

  1. Android编程权威指南第三版 第32章

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_35564145/article/de ...

  2. Android编程权威指南(第三版)- 2.8 挑战练习:添加后退按钮

    package com.example.geoquiz; import android.support.v7.app.AppCompatActivity; import android.os.Bund ...

  3. 《Android编程权威指南》

    <Android编程权威指南> 基本信息 原书名:Android programming: the big nerd ranch guide 原出版社: Big Nerd Ranch Gu ...

  4. 读《Android编程权威指南》

    因为去年双十二购买了一折的<Android 编程权威指南(第一版)>,在第二版出来后图灵社区给我推送了第二版的优惠码,激动之余就立马下单购买电子书,不得不说Big Nerd Ranch G ...

  5. 《Android编程权威指南》PhotoGallery应用梳理

    PhotoGalley是<Android编程权威指南>书中另外一个重要的应用.       

  6. 《Android编程权威指南》CriminalIntent项目梳理

    相信很多新手或者初级开发人员都已经买了第2版的<Android编程权威指南>, 这本书基于Android Studio开发,对入门人员来说是很好的选择,但是很可惜的是, 在完成一个项目后, ...

  7. Android编程权威指南(第2版)--第16章 使用intent拍照 挑战练习

    16.7挑战练习:优化照片显示 新建dialog_photo.xml 1234567891011121314 <?xml version="1.0" encoding=&qu ...

  8. Swift编程权威指南第2版 读后收获

    自从参加工作一直在用OC做iOS开发.在2015年的时候苹果刚推出swift1.0不久,当时毕竟是新推出的语言,大家也都很有激情的学习.不过在学完后发现很难在实际项目中使用,再加上当时公司项目都是基于 ...

  9. 《Android 编程权威指南》读书总结

    1.当一段代码被多次使用,可将这段代码封装成一个抽象类,以后再要用到该段代码时,直接extends(继承)这个抽象类. 2.SDK版本向后兼容,即在SDK发布后推出的Android版本都可以使用该SD ...

随机推荐

  1. SpringBoot 2.0 开发案例之百倍级减肥瘦身之旅

    前言 为了存我的小黄图,最近在做一款图床服务,集成了各种第三方云存储服务,目前正在内部测试阶段.项目是以Jar的形式运行在腾讯云上,不要问我为什么使用腾讯云了,因为阿里云老用户和狗不得入内. 问题凸显 ...

  2. Oracle运行脚本:exp,hist 和 err

    上一篇我们讲到:首次使用rman备份数据库时,为了安全起见,我们应将整个数据库exp出来. 显而易见,每次都手敲exp代码是不可取的. ----费时费力还不规范! 为此,我们可以写一个exp脚本,之后 ...

  3. ElasticSearch中文分词器-IK分词器的使用

    IK分词器的使用 首先我们通过Postman发送GET请求查询分词效果 GET http://localhost:9200/_analyze { "text":"农业银行 ...

  4. 定制linux镜像并自动化安装

    最近碰到个需求:要在内网环境安装centos6.5系统并搭建服务,但由于自动部署脚本里安装依赖包使用的是yum安装,而服务器无法连接外网,实施人员也不会本地yum源搭建….. 本来想法是打算把需要的依 ...

  5. 程序员这十个java题你都会吗?

    前言 不论你是职场新人还是步入职场N年的职场新人大哥大~当然这个N<3~,我能担保你答不对这十个题~不要问我为什么这么自信~,这些个题还是"有水平"的javase的基础题,传 ...

  6. Bootstrap布局基础

     1.栅格系统(布局)Bootstrap内置了一套响应式.移动设备优先的流式栅格系统,随着屏幕设备或视口(viewport)尺寸的增加,系统会自动分为最多12列. 我在这里是把Bootstrap中的栅 ...

  7. postman-接口间数据传递

    接口间数据传递 在我们做接口测试过程中会经常碰到使用上一个接口返回数据的情况,jmeter中可通过正则表达式提取,postman中如何提取呢?我们来看实例,这里使用的同一个接口来演示. ​ 我们提取出 ...

  8. csp-s m 80 题解

    写在前面:(扯淡话) 这次考试是AB组分开考,但是觉得题目并不是很水,所以就来写一下题解,其实这次由于翘掉了午休,所以考试的前半部分还是比较困的(越做越清醒!)今天调完还是很有感触的! 正文: T1 ...

  9. SSM整合案例--用户登录

    实现用户登录案例,并进行非法拦截 实现当用户未登录时,无法跳转到出登录页面以外的任何页面,拦截用户仍在登陆页面:当用户登录成功即可跳转到其他页面 (1)导入依赖 <!-- https://mvn ...

  10. FileStream相关知识分享

    一.如何理解FIleStream 通过前3章的学些,相信大家对于Stream已经有一定的了解,但是又如何去理解FileStream呢?请看下图: 我们磁盘中的任何文件都是通过二进制数组组成,最为直观的 ...