2011/09/30

Android Project で res を使う Library を作る

Android Project で res ディレクトリ以下を使用する Library を作成する場合は、名前が被るとうまくいかないという問題があります。
(参考:Android Project で Is Library を使う場合、res の管理に注意

では、どのようにすれば良いのかというと、Android Developers の Managing Projects
Use prefixes to avoid resource conflicts
To avoid resource conflicts for common resource IDs, consider using a prefix or other consistent naming scheme that is unique to the project (or is unique across all projects).
と書かれています。
つまり、Resource を定義するときに、他と被らないようなプレフィックスをつけるとか、特殊な名前のつけ方を検討するとかしましょう。ってことのようです。

やり方はいろいろあると思うのですが、手っ取り早いのはパッケージ名(ネームスペース)を使っちゃう方法ではないかと思いますので、以下にその方法を書いておきたいと思います。

  1. File -> New -> Android Project
    ダイアログが開くので、情報を入力。このとき、Create Activity のチェックは外しておく

  2. AndroidManifest.xml を開いて
    Define an <application> tag in the AndroidManifest.xml のチェックを外す

  3. res 以下のファイルは、
    ファイルを右クリック -> Refactor -> Rename
    main.xml -> com_kokufu_lib_main.xml
    のようにパッケージ名を含めた名前に変更します。


    res ディレクトリのファイルは、そのタイプによって扱いが変わるので注意が必要です。

    1. ファイル名がリソース名になるタイプ
      このタイプは、ファイル名を com_kokufu_lib_main.xml のようにパッケージ名を含めた形に変更します。このとき、名前の区切り文字は、.(ピリオド)ではなく_(アンダーバー)でないとうまくいきません。
      このタイプのリソースは以下のようなものがあります。
      • drawable
      • layout

    2. タグネーム等がリソース名になるタイプ
      このタイプは、XMLファイル内のタグネームがリソース名になります。
      values ディレクトリ以下におくようなファイルです。
      例えば、以下のような strings.xml ファイルの場合、各 string につける名前にパッケージ名をつけてやります。
      この名前には.(ピリオド)を使っても大丈夫ですが、リソース名としては、_(アンダーバー)に勝手に変換されたものが使用されます。
      なので、最初から_(アンダーバー)を使用しておいた方が混乱しなくて良いでしょう。

      strings.xml
      <?xml version="1.0" encoding="utf-8"?>
      <resources>
          <string name="com_kokufu_lib_hello">Hello World!</string>
          <string name="com_kokufu_lib_app_name">Lib</string>
      </resources>

    それぞれのリソースのタイプがどちらなのかを知るには、gen ディレクトリ以下に自動的に作られる R.java の中を覗いてみると良いです。(作られない場合は、プロジェクトをクリーンすると大抵作り直してくれます。)

    R.java
    package com.kokufu.lib;
    
    public final class R {
        public static final class attr {
        }
        public static final class drawable {
            public static final int com_kokufu_lib_icon=0x7f020000;
        }
        public static final class layout {
            public static final int com_kokufu_lib_main=0x7f030000;
        }
        public static final class string {
            public static final int com_kokufu_lib_app_name=0x7f040001;
            public static final int com_kokufu_lib__hello=0x7f040000;
        }
    }
    

    という感じで、リソースが定義されているので、これらがユニークになるよう名前を付けてやれば良いというわけです。

  4. あとは、普通にライブラリを作成する手順です。
    ライブラリを作成して、Properties -> Android
    Is Libary にチェックを入れておきます。

  5. ライブラリを使用する方のプロジェクトは、同じ画面で Add を押して、選択すればオッケーです。

0 件のコメント: