SDK添付サンプルの使用法:「はじめてのAndoid5プログラミング」

このページは「はじめてのAndoid5プログラミング」(清水美樹著、工学社刊、2015年2月14日発売、 ISBN978-4-7775-1879-1)の著者によるの著者による関連情報です。

本書で解説したコードの書き方はSDKに添付のサンプルを参考にしています。SDKのサンプルは、 ひとつのアプリにたくさんの機能を盛り込んでいるため、かなり完璧な一方、かなり複雑です。

これらのサンプルを利用する方法を解説します。

本書の目次へ
このサイトのトップへ


サンプル・フォルダを適当な場所にコピー

サンプル・フォルダの場所

サンプル・フォルダの場所は、インストールされた「android-sdk」フォルダの中です。このフォルダはユーザーのフォルダ中の隠しフォルダ「AppData」の中にあります。 「隠しフォルダ」の表示法については、筆者の別ページに説明があります。

図1 ユーザーが持っている隠しフォルダ「AppData」
図2 「android-sdk」フォルダの中に「sample」フォルダ
図2のようなサンプル・フォルダを、適当な場所にコピーして、好きなように編集することでコードの学習に役立ててください。

サンプル「FloatingActionButton」のインポート

たとえば、第4章で学んだ「フローティング・ボタン」の基になっているサンプルを調べてみましょう。

Android Studioのメニューで「File」-「Import Project」を選びます。(下に「Import Sample」という項目もありますが、往々にして不具合を出します)

図3 「プロジェクトをインポート」

サンプルの場所を探すウィンドウが出ます。コピーした「sample」フォルダの中から「android-21」というフォルダは自動的に開くでしょう。そこから「ui」-「views」 と開いていきます。

図4 「ui」さらに「views」と開く

「FloatingActionButton」というフォルダをさらに開きます。 図5のように「Android Studio」のアイコンが表示されているノードを選択して、開きます。最終的に「FloatingActionButtonBasic」というプロジェクトとして開きます。

図5 「Android Studio」のアイコンが出ているノードを選ぶ

SDK付属のサンプルの特徴

サンプルを開いてファイルの構造を見ると、ずいぶんとファイルが多いことがわかります。そのうち、アプリのパッケージ名「com.example.android」にさらに、 「common」という名前のパッケージ・フォルダがあり、「ログ」関係のプログラムが並んでいるのが見えます。

図6 「common」というパッケージ・フォルダ

図6の赤枠で囲んだパッケージの下に「floatingbuttonbasic」というパッケージ・フォルダがあり、そこにあるのが「MainActivity」やフラグメントなど、 本書でも書いてきたようなアプリのプログラムです。

この「common」というパッケージ・フォルダの下のプログラムがアプリにどうかかわっているのかは、アプリを実行してみるとわかります。 図7に示すように、出力ウィンドウが上部につくのです。

図7 上部に出力ウィンドウがつく

アプリのアクション・メニューが「Show Log」になっています。クリックすると、上部のウィンドウに「ログ」すなわち、 ボタンをクリックした結果がが表示されます。

図8 「ログ」を表示
これらの機能は便利ですが、「フローティング・ボタンはどうやって書くのか」には関係のないコードです。そこで、サンプルをざっくりと簡単にして、 フローティング・ボタンだけが表示されるようにしましょう。

関係ないコードを削除

関係ないクラスの定義をそっくり削除

まず、「プロジェクト・ビュー」を操作して、「common」パッケージ・フォルダの部分を全部削除します。図6に赤枠で示した部分です。

それに伴うコードの参照の欠落をこれから修正していきます。


「activity_main.xml」を修正

レイアウト・ファイル「activity_main.xml」を修正します。
上記の削除の操作で参照の欠落したところは「赤字」で表示されるのでわかるでしょう。
XMLの図9に示す「ViewAnimator」図10 にあたる「View」 の要素をそっくり削除します。

図9 「ViewAnimator」の部分をそっくり削除
図10「View」も削除

代わりに、「activity_main」の画面に「TextView」を置き、idを「logText」にしておきます。

図11「TextView」を付加

「MainActivity」を修正

Javaプログラム「MainActivity」から先に編集します。まず、「com.example.android.common」で始まるパッケージ名を持つクラスのインポート宣言を全部削除します。

図12「TextView」を付加

「MainActivity」から,メソッド「onCreateOptionsMenu」及び「onOptionsItemSelected」を削除します。これらのメソッドは特に必要ないうえに、中に書いてある内容が削除したプログラムを参照しておりエラーを起こすからです。

「MainActivity」の最初の宣言のところで、継承しているクラス名を見てください。「SampleActivityBase」の継承を宣言していて、それが参照エラーの赤字となっています。

図13「SampleActivityBase」を継承している

「SampleActivityBase」は削除したプログラムで定義されていたクラスで、もともとは「FragmentActivity」というクラスを継承しています。
この「FragmentActivity」は、実は「サポートライブラリ」のAPIです。「 android.support.v4.app」というパッケージのクラスです。このサンプル・プロジェクトでは、Gradleを用いてライブラリ "com.android.support:support-v4:21.+" を導入しています(本書5-2節)。

*サポート・ライブラリについての付加情報を「古いAndroidへの対応」というページで解説しています。

そこで、図13で示した宣言部分をリスト1のように書き換えれば、「MainActivity」のエラーはすべて消えます。

リスト1 「FragmentActivity」を継承
public class MainActivity extends FragmentActivity

「ログ機能」を復元

MainActivityのテキスト・ビュー

図8のような専用ウィンドウではなく、図11のようなテキスト・ビューにログを表示させるようにしましょう。

それには、「MainActivity」のメンバー変数としてテキスト・ビュー「logText」を取得し、値を適当に決めておきます。

リスト2 メンバー変数として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メソッドを定義します。
リスト3 logTextのgetメソッド
 protected TextView getLogText(){
      if(logText != null && logText instanceof TextView){
        return logText;
      }
    return null;
  }

「FloatingButtonBasicFragment」のテキスト・ビュー

「FloatingButtonBasicFragment」の定義においては、まず「com.example.android.common」ではじまるパッケージのインポートを省略します。

それから、TextViewのオブジェクトlogTextをこちらでもメンバー変数として取得します。

リスト4 logTextをgetメソッドで取得
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の修正

最後の作業です。メソッドonCheckedChangedにエラーが出ているでしょう。消去したクラスを参照しているからです。 ここを、logTextを用いてリスト5のように直します。

リスト5 メソッドonCheckedChangedの修正
@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の中身を確認するなど、コードの研究を進めてください。

図14 必要なものだけが表示されるようになった

本書の目次へ
このサイトのトップへ