使用最新AndroidStudio編寫Android編程權威指南(第3版)中的代碼會遇到的一些問題

Android編程權威指南(第3版)這本書是基於Android7.0的,到現在已通過於古老,最新的Android版本已經到10,而這本書的第四版目前尚未正式發售,在最近閱讀這本書時,我發現這本書的部分代碼已經不適合最新的Android開發,因此寫下了這篇文章,將我碰到的坑寫下來,幫助如今一樣在學習使用這本書的人。java

本文所說的環境基於AndroidStudio 3.5,Android SDK 28。android

 

在本書第七章7.3.3(中文第三版109頁)中寫道編程

要使用AppCompat支持庫,項目必須將其列入依賴關係。打開應用模塊下的build.gradle文件。每一個項目都有兩個build.gradle文件。一個用於整個項目,另外一個用於應用模塊。咱們要編輯的是app/build.gradle文件。
app

 但在最新版的AndroidStudio中,這步是能夠跳過的,在Google最新的文檔中,建議使用AndroidX代替com.android.support 包
ide

按照官方文檔說明 AndroidX 是對 android.support.xxx 包的整理後產物。因爲以前的 support 包過於混亂,因此,Google 推出了AndroidX。佈局

因爲在後續版本中,會逐步放棄對 support 的升級和維護,因此若是是新的項目建議直接使用AndroidX,若是是舊項目,也建議直接遷移到AndroidX學習

具體見如下的Google Android文檔。gradle

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

回到正題,最新的Android Studio中會默認引入AndroidX的appcompat包,因此徹底沒必要要進行這一步的操做。google

 

 

在本書第八章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 武裝CrimeAdapterCrimeListFragment.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:本人也在學習這本書,目前的進度就到這裏,之後發現新的問題再補充。

相關文章
相關標籤/搜索