このページは「はじめてのAndoid5プログラミング」(清水美樹著、工学社刊、2015年2月14日発売、 ISBN978-4-7775-1879-1)の著者によるの著者による関連情報です。
本書で解説したコードの書き方はSDKに添付のサンプルを参考にしています。SDKのサンプルは、 ひとつのアプリにたくさんの機能を盛り込んでいるため、かなり完璧な一方、かなり複雑です。
これらのサンプルを利用する方法を解説します。サンプル・フォルダの場所は、インストールされた「android-sdk」フォルダの中です。このフォルダはユーザーのフォルダ中の隠しフォルダ「AppData」の中にあります。 「隠しフォルダ」の表示法については、筆者の別ページに説明があります。
たとえば、第4章で学んだ「フローティング・ボタン」の基になっているサンプルを調べてみましょう。
Android Studioのメニューで「File」-「Import Project」を選びます。(下に「Import Sample」という項目もありますが、往々にして不具合を出します)
サンプルの場所を探すウィンドウが出ます。コピーした「sample」フォルダの中から「android-21」というフォルダは自動的に開くでしょう。そこから「ui」-「views」 と開いていきます。
「FloatingActionButton」というフォルダをさらに開きます。 図5のように「Android Studio」のアイコンが表示されているノードを選択して、開きます。最終的に「FloatingActionButtonBasic」というプロジェクトとして開きます。
サンプルを開いてファイルの構造を見ると、ずいぶんとファイルが多いことがわかります。そのうち、アプリのパッケージ名「com.example.android」にさらに、 「common」という名前のパッケージ・フォルダがあり、「ログ」関係のプログラムが並んでいるのが見えます。
図6の赤枠で囲んだパッケージの下に「floatingbuttonbasic」というパッケージ・フォルダがあり、そこにあるのが「MainActivity」やフラグメントなど、 本書でも書いてきたようなアプリのプログラムです。
この「common」というパッケージ・フォルダの下のプログラムがアプリにどうかかわっているのかは、アプリを実行してみるとわかります。 図7に示すように、出力ウィンドウが上部につくのです。
アプリのアクション・メニューが「Show Log」になっています。クリックすると、上部のウィンドウに「ログ」すなわち、 ボタンをクリックした結果がが表示されます。
まず、「プロジェクト・ビュー」を操作して、「common」パッケージ・フォルダの部分を全部削除します。図6に赤枠で示した部分です。
それに伴うコードの参照の欠落をこれから修正していきます。
レイアウト・ファイル「activity_main.xml」を修正します。
上記の削除の操作で参照の欠落したところは「赤字」で表示されるのでわかるでしょう。
XMLの図9に示す「ViewAnimator」図10 にあたる「View」
の要素をそっくり削除します。
代わりに、「activity_main」の画面に「TextView」を置き、idを「logText」にしておきます。
Javaプログラム「MainActivity」から先に編集します。まず、「com.example.android.common」で始まるパッケージ名を持つクラスのインポート宣言を全部削除します。
「MainActivity」から,メソッド「onCreateOptionsMenu」及び「onOptionsItemSelected」を削除します。これらのメソッドは特に必要ないうえに、中に書いてある内容が削除したプログラムを参照しておりエラーを起こすからです。
「MainActivity」の最初の宣言のところで、継承しているクラス名を見てください。「SampleActivityBase」の継承を宣言していて、それが参照エラーの赤字となっています。
「SampleActivityBase」は削除したプログラムで定義されていたクラスで、もともとは「FragmentActivity」というクラスを継承しています。
この「FragmentActivity」は、実は「サポートライブラリ」のAPIです。「 android.support.v4.app」というパッケージのクラスです。このサンプル・プロジェクトでは、Gradleを用いてライブラリ "com.android.support:support-v4:21.+" を導入しています(本書5-2節)。
*サポート・ライブラリについての付加情報を「古いAndroidへの対応」というページで解説しています。
そこで、図13で示した宣言部分をリスト1のように書き換えれば、「MainActivity」のエラーはすべて消えます。
public class MainActivity extends FragmentActivity
図8のような専用ウィンドウではなく、図11のようなテキスト・ビューにログを表示させるようにしましょう。
それには、「MainActivity」のメンバー変数としてテキスト・ビュー「logText」を取得し、値を適当に決めておきます。
public class MainActivity extends FragmentActivity { TextView logText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); logText = (TextView)findViewById(R.id.logText); ... 書かれている通り... }logTextにログを書かせる作業は、フラグメントFloatingButtonBasicFragment(これから編集します。今はエラーが表示されているでしょう) の中で行います。そのため、MainActivityのほうにリスト3のようなgetメソッドを定義します。
protected TextView getLogText(){ if(logText != null && logText instanceof TextView){ return logText; } return null; }
「FloatingButtonBasicFragment」の定義においては、まず「com.example.android.common」ではじまるパッケージのインポートを省略します。
それから、TextViewのオブジェクトlogTextをこちらでもメンバー変数として取得します。
public class FloatingActionButtonBasicFragment extends Fragment implements FloatingActionButton.OnCheckedChangeListener{ TextView logText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ...rootViewについて書いてある部分... //rootViewの生成とは関係ない logText =( (MainActivity)getActivity()).getLogText(); logText = setText("This app shows floating action buttons"); return rootView; }
上のリスト4では、logTextをアクティビティからメソッドgetLogTextで取得しています。フラグメントのビューであるrootViewとは関係ないのですが、話を簡単にするためメソッドonViewCreateの中に入れてしまいます。
最後の作業です。メソッドonCheckedChangedにエラーが出ているでしょう。消去したクラスを参照しているからです。 ここを、logTextを用いてリスト5のように直します。
@Override public void onCheckedChanged(FloatingActionButton fabView, boolean isChecked) { switch (fabView.getId()){ case R.id.fab_1: logText.setText(String.format("FAB 1 was %s.", isChecked ? "checked" : "unchecked")); break; case R.id.fab_2: logText.setText(String.format("FAB 1 was %s.", isChecked ? "checked" : "unchecked")); break; default: break; } }
以上、図14に示すように、簡単な表示になりました。この上で、 クラスFloatingButtonの中身を確認するなど、コードの研究を進めてください。