2011.03.07

【正誤情報】 『作りながら覚えるAndroidプログラミング』(7/19更新)

作りながら覚えるAndroidプログラミング

 本書では、プログラミングにAndorid SDK r8およびEclipse用プラグイン(ADT)8.0.1を使用しています。そのため、最新のAndroid SDK r10とADT 10.0.0ではEclipseでの動作や画面表示が異なることがあります。以下では、プログラミング内容に影響する変更点を紹介していきます。なお、7月15日より以前の訂正部分については、初版第2刷以降で反映済みです。
 また、本文の記述に誤りがありましたので、ここにお詫びし、訂正いたします。

===========================================================================

○デフォルトのオブジェクトIdが変更されている

レイアウトエディター画面でオブジェクトを追加すると、ADT8までは「<クラス名><2桁の連番>」というIdがセットされましたが、ADT9以降ではクラス名の先頭文字を小文字にし、1桁の連番を付加したIdに変更されています。たとえば、EditTextを追加したときにADT8では「EditText01」というIdになりますが、最新の開発環境では「editText1」となります。そのため、Idを使用してレイアウト上のオブジェクトにアクセスするプログラムでは、プログラム側かレイアウト側でIdを修正する必要があります。できればプログラム側を修正する方がいいのですが、ミスが発生しやすくなるので、レイアウト作成時に「<クラス名><2桁の連番>」という形式に変更することをお勧めします。なお、112ページの表2のように、「自動で設定されるものから変更する必要はありません」と注記されているものでも修正が必要となります。

 

===========================================================================

○クラス標準のメソッドで「@Override」の削除を促される

リストに従ってクラス標準のメソッドを手入力で追加した場合、まれに「スーパタイプ・メソッドをオーバーライドまたは実装する必要があります」と表示され、「@Override」の削除を促されることがあります。この場合、手入力したメソッドをいったん削除し、「メソッドのオーバーライド/実装」または「実装されていないメソッドの追加」でメソッドを追加するとエラーは解消します。

なお、状況によっては「Android requires compiler compliance level 5.0. Please fix project properties.」、「Android requires source compatibility set to 5.0. Please fix project properties.」、「パラメーター化された型はソース・レベルが 1.5 の場合にのみ使用可能です」、「注釈はソース・レベルが 1.5 の場合にのみ使用可能です」などのエラーが「問題」ウィンドウに表示されることがあります。この場合、まずEclipseの設定画面で「Java→コンパイラー」に移動して「コンパイラー準拠レベル」を現在と別の値に変更してから「OK」ボタンをクリックします。「フル・ビルドを行いますか?」と表示されますが、ここでは「いいえ」ボタンをクリックします。再び設定画面を開き、「コンパイラー準拠レベル」を元の値に戻して「OK」ボタンをクリックします。今度は「はい」ボタンをクリックしてフル・ビルドを実行すれば、エラーが解消するはずです。

2011/3/24追加

===========================================================================

STEP 2

ADT11ではレイアウト編集画面でAndroidバージョンを選択できます。ここで「Android 2.2」を選択した場合、DigitalClockを追加すると「NullPointerException」と表示され、レイアウトの操作ができなくなります。この場合、いったん「main.xml」を閉じて開きなおせばエラーが消えます。

2011/3/24追加

===========================================================================

40ページ 本文

(誤)
IDの追加はレイアウト編集画面でLinearLayoutを選択し、プロパティー画面で「Id」に「@+Id/layout」と入力すれば完了です。

———————————————————————-
(正)
IDの追加はレイアウト編集画面でLinearLayoutを選択し、プロパティー画面で「Id」に「@+id/layout」と入力すれば完了です。

===========================================================================

STEP 3 64ページ リスト18 コード追加

———————————————————————-
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);

 if(resultCode==RESULT_OK){
  EditText et=(EditText) findViewById(R.id.EditText01);

  switch(requestCode){
  case 0:
   et.setText(data.getStringExtra(“text”));
       memoChanged=false; ←——————– 追加
       break;
  }
 }
}
———————————————————————-

「break;」の前に「memoChanged=false;」を挿入してください。

===========================================================================

STEP 3 71ページ 表14見出し

(誤)
string.xmlに追加するリソース

———————————————————————-
(正)
strings.xmlに追加するリソース

===========================================================================

STEP 3 74ページ 表22キャプション

(誤)
クラス作成画面で「参照」ボタンをクリックしてスーパークラスを検索すると、「android.widget.ArrayAdapter<T>」のようにセットされるので、「<T>」を「<object>」に書き換えておきましょう。

———————————————————————-
(正)
クラス作成画面で「参照」ボタンをクリックしてスーパークラスを検索すると、「android.widget.ArrayAdapter<T>」のようにセットされるので、「<T>」を「<Object>」に書き換えておきましょう。

===========================================================================

STEP 3 84ページ リスト53

保存するファイル名を生成する際に、メモの先頭12文字以内に改行が含まれると不正なファイル名となり、ファイルが保存できなくなります。そのため、7行目の「replaceAll」メソッドで改行文字を置き換えるように記述を追加します。89ページから91ページに掲載した「Memopad.java全体のソースリスト」では225行目に該当します。

———————————————————————-
(変更前)

fn=memo.replaceAll(“\\|\.|\/|:|\*|\?|”|<|>|\|”, ” “).trim();

———————————————————————-
(変更後)

fn=memo.replaceAll(“\\|\.|\/|:|\*|\?|”|<|>|n|\|”, ” “).trim();

———————————————————————-

2011/3/24追加

===========================================================================

STEP 5 115ページ リスト4補足説明

113ページの方法で追加したonTouchメソッドでは引数が「arg0」、「arg1」となっているので、それぞれ「v」、「event」と書き換えてください。

===========================================================================

STEP 5 119ページ リスト追加

———————————————————————-

void save(){
 ….
 ….

 if(writeImage(file)){
  scanMedia(file.getPath()); ← 追加する
  SharedPreferences.Editor editor=prefs.edit();
  editor.putInt(“imageNumber”, imageNumber+1);
  editor.commit();
 }
 ….
 ….
———————————————————————-
scanMediaメソッドを呼び出すコードの追加が抜けていました。saveメソッドの「if(writeImage(file))」ブロックの先頭に「scanMedia(file.getPath());」を追加してください。

===========================================================================

STEP 5 122ページ リスト20

(誤)
import android.content.Intent

———————————————————————-
(正)
import android.content.Intent;

———————————————————————-

最後にセミコロンを追加してください。

===========================================================================

STEP 6 134ページ 表7 プロパティー追加

「Enabled」プロパティーの設定が抜けています。「スタート」ボタンと「ストップ」ボタンの「Enabled」プロパティーをそれぞれ「false」に設定してください。

===========================================================================

STEP 7 155ページ
最新の開発環境では「RadioGroup」にデフォルトで「RadioButton」が3つ配置されています。そのため、1つ削除してプロパティーを設定してください。

===========================================================================

STEP 8 175ページ リスト7 変数名変更

「実装されていないメソッドの追加」で追加した「onClick」メソッドでは引数の変数名が「arg0」になっているので、「v」に変更してからリストの内容を追加してください。

(変更前)
public void onClick(View arg0) {

———————————————————————-
(変更後)
public void onClick(View v) {

===========================================================================

STEP 9 189ページ リスト7 変数名変更

最新の開発環境では「実装されていないメソッドの追加」で追加した「onSensorChanged」メソッドの引数が「arg0」から「event」に変更されています。そのため、リスト7は「arg0」を「event」に置き換えて入力してください。

===========================================================================

STEP 9 189ページ リスト7 補足説明

ランドスケープが標準状態のタブレット型端末などでは、X軸とY軸が逆になることがあります。この場合は「values[0]」と「values[1]」を入れ替えます。また、傾きと逆方向にボールが転がってしまう場合、「-values[0]」または「-values[1]」のように記述してみましょう。

2011/7/18追加

===========================================================================

STEP 10 206ページ 表1の「Min SDK Version」設定内容

(誤)
Androidバージョンに一致するSDKバージョン。ただしバージョン8以降

———————————————————————-
(正)
Androidバージョンに一致するSDKバージョン。ただしバージョン7以降

2011/7/18追加

===========================================================================

STEP 10 214ページ 表15 「TextView01」の「Text size」プロパティー

(誤)
22dp

———————————————————————-
(正)
22sp

===========================================================================

STEP 11 228ページ パッケージ名を変更する場合の注意点

ADT 9~11では、本書の手順どおりにパッケージ名を変更すると、AndroidManifest.xmlの内容が正しく設定されません。そのため、リファクタリングの実行後にAndroidManifest.xmlを開いて「AndroidManifest.xml」タブでXMLソースを直接書き換える必要があります。内容がおかしくなるのは、もともと「android:name=”.<クラス名>”」と記述されていた部分なので、エラーの表示されている行を探して記述を元の「android:name=”.RssReader”」に戻しましょう。Ctrl+Sキーを押すと「起動構成の更新」ダイアログボックスが表示されるので、「はい」ボタンをクリックしてからクラスファイルの修正を実行しましょう。

———————————————————————-
(修正前)

    <application android:icon=”@drawable/icon” android:label=”@string/app_name”>
        <activity androidwidget.RssReadersReader” <———————————-正しく設定されない
                        android:label=”@string/app_name”>
———————————————————————-
(修正後)

    <application android:icon=”@drawable/icon” android:label=”@string/app_name”>
        <activity android:name=”.RssReader”
                        android:label=”@string/app_name”>

 

===========================================================================

STEP 11 230ページ~231ページ

リスト1 追加するインポート宣言
———————————————————————-
import android.app.PendingIntent;
import android.content.ComponentName;
import android.widget.RemoteViews;
import android.content.Intent;
import android.content.SharedPreferences;
———————————————————————-

————————————————————————-

○リスト2

指定した更新時間が来て「onUpdate」メソッドが呼び出されると、続いて「onReceive」メソッドも呼び出されます。処理がonReceiveメソッドと重複するので、リスト2はカットします。ただし、onUpdateメソッド自体は実装しておく必要があります

————————————————————————-

○リスト3

ユーザーが指定したRSSフィードのURLをウィジェット側で読み込んで、RssReaderクラスの「strUrl」にセットする処理をリストの先頭に追加します。また、表示の更新処理をonReceiveメソッドでのみ実行するように変更したので、リスト3に続けてリスト5の処理もこの段階で追加します。ただし、オフライン時にウィジェットの表示内容が消えてしまわないように、読み取り結果をいったん変数に格納して、長さが0でない場合にのみ表示を書き換えるように処理を変更しました。

リスト3の先頭に追加する内容
———————————————————————-

SharedPreferences prefs=context.getSharedPreferences(“RssReaderPrefs”,Context.MODE_PRIVATE);
RssReader.strUrl=prefs.getString(“server”,context.getResources().getTextArray(R.array.ServiceUrl)[0].toString());

———————————————————————-

リスト3の最後に追加する内容
———————————————————————-

String rss=RssReader.readRss(true);
 if(rss.length()>0){
  rv.setTextViewText(R.id.TextView01, rss);
  appWidgetManager.updateAppWidget(me, rv);
 }

———————————————————————-

リスト3全体(変更後)
———————————————————————-

SharedPreferences prefs=context.getSharedPreferences(“RssReaderPrefs”,Context.MODE_PRIVATE);
RssReader.strUrl=prefs.getString(“server”,context.getResources().getTextArray(R.array.ServiceUrl)[0].toString());

RemoteViews rv=new RemoteViews(context.getPackageName(),R.layout.rssreader_widget);
AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context);
ComponentName me=new ComponentName(context,RssReaderWidget.class);

Intent i;
i=new Intent(context,RssReader.class);
 PendingIntent pendingIntent=PendingIntent.getActivity(context, 0, i, 0);
 rv.setOnClickPendingIntent(R.id.TextView01, pendingIntent);
 appWidgetManager.updateAppWidget(me, rv);
 
 String rss=RssReader.readRss(true);
 if(rss.length()>0){
  rv.setTextViewText(R.id.TextView01, rss);
  appWidgetManager.updateAppWidget(me, rv);
 }

———————————————————————-

————————————————————————-

リスト5

リスト5の内容はリスト3に統合されたので、カットします。

2011/7/15更新

===========================================================================