読者です 読者をやめる 読者になる 読者になる

Android Studioでアプリ開発!

Androidアプリ開発初心者の備忘録です。

一つのプロジェクトから複数作ったアプリをプログラムで条件分岐させる方法

無料版と有料版で条件分岐させて異なる処理を実施したい

Android Studioで、一つのプロジェクトから複数のアプリを作成する方法 - Android Studioでアプリ開発!の補足です。
一つのプロジェクトから複数アプリを作った場合に、プログラム的に条件分岐させたい場合があります。例えば無料版だけ以下のように「有料化する」ボタンを表示し、有料版には表示しない場合です。
f:id:jolene:20140723160211p:plain

今回は、これを実現する条件分岐の方法について説明したいと思います。

リソースで分岐する

いきなりプログラムから外れますが、複数アプリを作る際にはリソースを別々に管理できることを説明しました(一つのプロジェクトから複数のアプリを作る場合のリソースは最小限にできる - Android Studioでアプリ開発!)。無料版と有料版でレイアウトファイルを分けて作ることができるので、ボタンの有無など個別化を図るには最適です。
単純なレイアウトなら、この方法がメンテナンスもしやすくミスも起こりにくいので、まず第一に検討したい方法です。しかし、複雑なレイアウトを持つアクティビティの中の1か所だけ変えたい場合は、リソースを分けるよりもプログラムで変更したほうが低コストになる場合もあります。

パッケージ名を取得して条件分岐する

複数アプリを作ったので、当然パッケージ名も異なります。これを利用して条件分岐する方法です。パッケージ名の取得はアプリのパッケージ名をプログラムから取得する - Android Studioでアプリ開発!を参照してください。

今回の例では、無料版のパッケージ名が com.example.Switching.free で、有料版が com.example.Switching.charge です。

条件分岐のプログラムは以下のようになります。

String packageName = getPackageName();
Button button = (Button) findViewById(R.id.btn_charge);
if (packageName.indexOf("free") == -1) {
    // 有料版
    button.setVisibility(View.INVISIBLE);
} else {
    // 無料版
    button.setVisibility(View.VISIBLE);
}

パッケージ名に free がなければ有料版として「有料化する」ボタンを非表示にしています。free が見つかれば無料版として「有料化する」ボタンを表示しています。
作成したアプリが無料版と有料版の2つだけならこの方法でも十分だと思います。

strings.xml の app_name を利用して条件分岐する

複数アプリを作ったので、当然アプリ名も異なります。これを利用して条件分岐する方法です。アプリ名はそれぞれのリソースの strings.xml に記述していると思います。

今回の例では、無料版のアプリ名が Switching free で、有料版が Switching charge です。

条件分岐のプログラムは以下のようになります。

String app_name = getResources().getString(R.string.app_name);
Button button = (Button) findViewById(R.id.btn_charge);
if (app_name.indexOf("free") == -1) {
    // 有料版
    button.setVisibility(View.INVISIBLE);
} else {
    // 無料版
    button.setVisibility(View.VISIBLE);
}

アプリ名に free がなければ有料版として「有料化する」ボタンを非表示にしています。free が見つかれば無料版として「有料化する」ボタンを表示しています。
これもパッケージ名を取得したときと同様、作成したアプリが無料版と有料版の2つだけなら有効な方法だと思います。
ですが、作成したアプリが3つ以上のときは if〜else 文が多くなってしまい、メンテナンス性が悪くなってしまいます。

識別用のリソースを追加して、それを元に条件分岐する

free と charge のリソースに識別用のデータを追加します。
free の strings.xml

<integer name="kind_id">0</integer>

charge の strings.xml

<integer name="kind_id">1</integer>

条件分岐のプログラムは以下のようになります。

int kind_id = getResources().getInteger(R.integer.kind_id);
Button button = (Button) findViewById(R.id.btn_charge);
switch (kind_id) {
    case 0: // 無料版
        button.setVisibility(View.VISIBLE);
        break;
    case 1: // 有料版
        button.setVisibility(View.INVISIBLE);
        break;
}

それぞれのリソースに定義した識別IDを元に switch 文で条件分岐しています。この方法なら3つ以上のアプリを作った場合も case を追加していくだけなのでメンテナンスは楽です。

まとめ

一つのプロジェクトから複数のアプリを作った場合の条件分岐方法について説明してきました。リソースファイルを別々に持つことが最適だと思いますが、プログラムによっても分岐させることが可能です。ですが、どうしてもプログラム内にゴリゴリと固定の文字列なり ID を記述しなくてはならず、エレガントとは言えません。どなたかもっと上手な方法があれば教えて下さい。

Android StudioではじめるAndroidプログラミング入門

Android StudioではじめるAndroidプログラミング入門

初歩からわかるAndroid最新プログラミング 増補改訂版

初歩からわかるAndroid最新プログラミング 増補改訂版