【Android】もっと先へ「加速」したくはないか、少年 〜Project Template編〜を見て、実際に自分でも試してみました。
パッケージ構成はBest practices in Android developmentの通りに再現することにしました。
パッケージ構成以外に、リソースファイルもテンプレートで追加させることができるので、color.xmlなどよく使うものがあれば追加してやると便利かもしれません。
AndroidStudio.appの中に直接作成したら、アップデートの際にどうなるか分からなかったので、Gitで別途管理することにしました。作成したテンプレートはGitHubで公開しています。
注意点 テンプレートファイルを書き換えても、都度Android Studioを再起動させないと変更が反映されません。ちょっと変わった処理をしようと思うと、動作確認が面倒くさいです。
ディレクトリにファイルを置けばそれが反映されるわけではなく、recipe.xml.ftlで指定したファイルが作成されます。rootディレクトリ以下に作ったディレクトリが勝手に再現されるのかと思っていたら全然違いました。
template.xml template.xmlはテンプレートファイルの名前や入力項目などを決めるファイルになっています。
<parameter>タグを追加することで、入力項目を増やすことができます。
ちなみにこのテンプレートでは、package-info.javaの@authorを変更できるようにしてみました。
<parameter id="author" name="Author" type="string" default="Gen" help="This uses javadoc @autohr in package-info.java." /> package-info.javaでは以下のようにして参照できました。idで指定した文字列で参照できるみたいです。
/** * Activities. * @author ${author} */ package ${packageName}.activities; 参考
Custom Projects In Android Studio
Android Studioのバージョンアップができない 注意点として上記のテンプレートを追加すると、以下ののようなメッセージが表示されAndroid Studioのバージョンアップができません。
そのため、バージョンアップする際には追加したテンプレートを手動で削除してやる必要があります。
バージョンアップすると追加したテンプレートは消されてしまうのではと思っていたのですが、そもそもバージョンアップ自体ができませんでした。
プロジェクトテンプレートを自分で追加する場合、テンプレートで得られるメリットと、バージョンアップ時に手動で消さなければならないというデメリットを天秤にかけてから行うようにしてください。
静止画像(pngなどの画像リソース)を用意してパラパラ漫画の要領でアニメーションさせるには、AnimationDrawableクラスを利用します。
Android APIs Reference – AnimationDrawable
文字が変わってるだけですが、3つの画像でアニメーションしてます。画像を準備するのが面倒くさかったので、文字だけの画像を使いました。
アニメーションに使う静止画像 画像は解像度に合わせてres/drawable/hdpiなどのディレクトリに用意します。
今回はanime_test1.png,anime_test2.png,anime_test3.pngの3つの画像ファイルを用意しました。画像と言いつつ数字の1,2,3が書かれているだけの画像です。
ちなみにファイル名として使えるのは小文字のアルファベット、数字、アンダースコア(_)とドット(.)のみです。それ以外の文字(大文字アルファベットなど)を使うと以下のようにコンパイルエラーとなります。
Invalid file name: must contain only lowercase letters and digits ([a-z0-9_.]) アニメーション設定のXMLファイル どの画像を何秒間表示させるのかという設定をXMLファイルに記述します。今回はres/drawable/test_animation.xmlというファイル名にしました。
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/anime_test1" android:duration="500"/> <item android:drawable="@drawable/anime_test2" android:duration="500"/> <item android:drawable="@drawable/anime_test3" android:duration="500"/> </animation-list> android:oneshot=trueで、アニメーションを1回のみ再生する設定になります(最後の画像でアニメーションが止まる)。falseだとループ再生されます。
アニメーションを再生する test_animationは何もしなければ単なる静止画と同じで、Drawableとして扱うことができます。ImageViewのsrc属性に設定したり、TextViewのbackground属性に設定したりすることができます。
今回はImageButtonに上記で作成したdrawableを設定してやり、ボタンを押したらアニメーションが再生されるようにしてみます。
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/image_button" android:src="@drawable/test_animation" /> </RelativeLayout> APIリファレンスではandroid:background属性に設定していますが、これはandroid:src属性に設定しても動きました。src属性にAnimationDrawableを設定した場合、getBackground()ではなくgetDrawable()でAnimationDrawableを取得します。
MainActivity.java(onCreateを抜粋)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageButton imageButton = (ImageButton) findViewById(R.id.image_button); final AnimationDrawable animationDrawable = (AnimationDrawable) imageButton.getDrawable(); imageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { animationDrawable.start(); } }); } AnimationDrawableを取得して、start()メソッドを呼び出せばアニメーションさせることができます。
ただしできるのは再生するか停止するかくらいで、逆再生したりはできないみたいです。
Android Support LibraryのソースコードはAndroid Studioで確認することができません
例えば、android.support.v7.app.ActionBarActivityのソースコードを確認したいとしましょう。その場合、調べたいクラスをCmd+クリックすることで、対象のクラスのソースコードに自動的にジャンプできます。
しかし、サポートライブラリについてはソースコードまでは見つかりません。
ちなみにAndroid SDKのクラスであれば、SDKマネージャーでソースコードまでダウンロードしていれば確認することができます。例えばBundleクラスのソースコードは以下のように確認できます。
サポートライブラリのソースコードを確認するのは、Gitを使ってGoogleのリポジトリから拾ってくる方法もありますが、今回はWebサービスのGrepCodeを利用してみます。
GrepCodeにアクセスして、検索したいクラスを入力します。(今回の場合はandroid.support.v7.app.ActionBarActivity)
すると検索結果が表示されるので、調べたいクラスのバージョンを選択します。
他のバージョンとの差異をDiffで確認できるので、バージョンアップでどこが変更されたのかを調べるのにはちょうどいいかもしれません。
最近Android Studioを使ってプロジェクトを作った際に、ActionBarが表示されていないことが気になっていました。
以前までだと、特に何もしなくとも表示されていたはずのActionBar。自分でも特にActionBarのためにコードを書いたり、XML書いたりした覚えがないので、どうすればいいのやらサッパリでした。
実際にはタイトルバーの部分にアプリアイコンが表示されなくなってるだけであって、ActionBarがなくなっているわけではありません。画面のプレビューではActionBarが表示されなくなっていたせいで、私が勘違いしていただけでした。
上記の画像は、両方共ソースコードに変化はありませんが、targetSdkVersionと利用するサポートライブラリのバージョンが異なるものです。
左がtargetSdkVersionが20、app/build.gradleのdependanciesで利用するサポートライブラリのバージョンをcom.android.support:appcompat-v7:20.+と指定したもの。
右はAndroid Studio 1.0の新規プロジェクト作成ウィザードで作られたデフォルトの状態のもの。(targetSdkVersion21,com.android.support:appcompat-v7:21.0.3)
API21(Lolipop)からMaterial Designが導入されたことによる影響なんでしょうね。新しく導入されたToolBarを使えということなんでしょうが、使い方がよく分からず苦戦中です。
ちなみに右の状態でも、エミュレーターで実行するとちゃんとActionBarが表示されます。(ただし従来のようなアプリアイコン+タイトルの表示ではありません)
ToolBarのClass Overviewに以下の記述があり、Lolipop以降では従来のアプリケーションアイコン+タイトルはやめろってことなんでしょうね。
In modern Android UIs developers should lean more on a visually distinct color scheme for toolbars than on their application icon. The use of application icon plus title as a standard layout is discouraged on API 21 devices and newer. 確かにマテリアルデザインで設計された画面の中でアプリアイコンがぽつんとあると、浮いた感じがして気持ち悪い気もしてきました。 それにしてもデザインに対するハードルがどんどん上がっていって辛い・・・。
私は未だにAndroidのOSバージョンとAPIの数字とコードネームが結びついていません。最新の5.0がAPI21で、Lolipopだというのは分かるんですけどね。
ソースコードを読んでいて、JBとかICSとか出てきて「それバージョンで言うとどこ?」と混乱したのでまとめておくことにしました。
バージョン コードネーム api 5.0.1 Lolipop 21 4.4w Android L Preview 20 4.4 KitKat 19 4.3 Jelly Bean 18 4.2.x 17 4.1.x 16 4.0.3〜4.0.4 Ice Cream Sandwich 15 4.0〜4.0.2 14 3.2 Honeycomb 13 3.1 12 3.0 11 2.3.3〜2.3.7 Gingerbread 10 2.3〜2.3.2 9 2.2 Froyo 8 2.1 Eclair 7 2,0.1 6 2.0 5 1.6 Donut 4 1.5 Capcake 3 1.1 2 1.0 1 Android Studioのデフォルトでは、API10〜21をサポートするようにプロジェクトが作成されます。2.3.3までサポートするということですね。 ちなみにOSバージョンごとのシェアはAndroid DevelopersのDashbordsで公開されています。(2.2以降のバージョンのみですが)
コードネームの頭文字がAから順番につけられているので、それを押さえていれば大体どのあたりのバージョンなのか検討がつくかもしれません。
今までプログラムの全体像を頭の中でイメージし、後は勢いでコーディングして完成させるという作り方をしてきていました。大規模なプログラムを作ることがなかったので、今まではそれで何とかなっていたのですが、最近それも限界を感じています。
Androidのアプリを作るのに、画面がどう遷移してどういう処理が必要で・・・なんていうことを頭の中だけでは把握できません。
それに勢いだけでコーディングしていると、このクラスが一体何の働きをしているのかが分からなくなってきます。作成中はまだ大丈夫なのですが、時間が経つともうわけがわからなくなります。
1分間タイマーは勢いだけで作り上げましたが、もう機能修正とか追加とかやりたくありません。どこで何やっているか自分でも訳がわからないからです。
そんなわけで、設計方法を学ぼうかななんて思って行動を始めました。
頭の中だけでプログラムをイメージするのには限界があるので、少なくとも設計図を用意したい。設計図を作るには、どういうふうにプログラムを組み上げていくのがいいのか、その手法を知る必要がある。という感じです。
とりあえずUMLの書き方さえ知らないので、UMLの入門書を読んで、ついで実践UMLという本を図書館で借りてきて読みました。
とりあえずわかったのはこんな感じですかね。
UMLが書けることとクラス設計ができることは別の話 最初に完璧な設計書を用意するという考えは間違ってる とりあえずやってみないと始まらない UMLの書き方をマスターしたからといって、それだけでは設計書を作ることはできません。個人開発で使う分には、最低限自分が分かればいいので、細かいUMLの書き方をマスターしようとするのはちょっと脱線しすぎかもしれません。
プログラムの設計図を完璧に仕上げてからコーディングをしていくというのはウォーターフォール的発想だからやめろと実践UMLには書いてありました(意訳)。オブジェクト指向開発的には、もっとフレキシブルに設計とコーディングを行き来しながら開発していくんだそうで。
確かに、どういう作りにすればいいのかと完璧な設計を求めるあまりに、プログラムが完成しなければなんのための設計なんだという話になりますもんね。まあ今の私がそうなんですけど。
実践UMLを読んで感じたのは、内容がかなり濃い&難しいので、とりあえず前半くらいの内容を利用して実際に設計→コーディングのサイクルを回していくのがいいのだろうと思いました。どう作っていけばスマートなのかを考えだすとキリがないので、とりあえずやってみなければ始まらない。
アプリの機能、要件を定義して、そこからどういうクラスが必要なのかを検討して、実際に作ってみる。上手くいかなければ設計しなおして、やり直す。もっといい作り方がないかなとか追い求めると何もできなくなってしまうので、とりあえず作る。そんな方針で進めてみようと思います。
それと並行して設計方法についても勉強したいなと思っています。何かおすすめがあれば教えていただきたいです。
実践UML 第3版 オブジェクト指向分析設計と反復型開発入門
MacをYosemiteにバージョンアップしたらAndroid Studioが起動しなくなりました。
原因はYosemiteへのアップデートでJDK 1.6が消えてしまったことが原因のようでした。(消えたのか参照できなくなったのかはよく分かりませんが・・・)
ターミナルで/usr/libexec/java_home -v 1.6と打つと、Unable to find any JVMs matching version “1.6”.と表示されました。JDK 1.7と1.8はバージョンアップ前と同じように存在してくれてましたが、1.6だけ参照できなくなってました。
対策はJDK 1.6(Java 6)を再インストールすればOKです。JDK1.6(Java 6)はこちらからダウンロードできます。
Android StudioでJunit4を使ったテストを実行する方法は、今のところ2通りあるみたいです。
TestRunnerを指定して行う(android-junit4を使う) Robolectricを使う TestRunnerを指定した方法だと、IDEでテストの実行結果が確認できるので便利です。ただし、設定がややこしいのが不便なところです。簡単に取り込める方法があれば教えて欲しいです。
対してRobolectricを使う場合は、テストの実行結果をブラウザで確認しなければならないというデメリットはありますが、導入方法が比較的簡単です。今回はRobolectricを使ってJunit4によるユニットテストを実施する手順を紹介します。
Qiitaのこちらの記事があってようやくまともに入れることができました。感謝感謝。
1. プロジェクトを作成する Android StudioのメニューからFile > New Projectを選択し、新規プロジェクトを作成します。単にプロジェクトを作成するだけです。別に既存のプロジェクトを使うなら飛ばして問題無いです。
2. build.gradleの編集 プロジェクトルートのbuild.gradleにclasspath 'org.robolectric:robolectric-gradle-plugin:0.13.+'を追記します。(app/build.gradleではないです)
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:0.13.2' classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } 新規プロジェクトの場合、build.gradleがこうなればOKです。(この例ではAndroid Studio 0.8.14を使っています)
3. app/build.gradleの編集 やることは3つです。
apply plugin: ‘robolectric’の追加 dependenciesの追加 robolectricディレクティブの追加 apply pluginの追加 app/build.gradleの2行目(apply plugin: 'com.android.application'のすぐ下)にapply plugin: 'robolectric'を追加します。
dependenciesの追加 RobolectricとJunit4を追加をします。
androidTestCompile 'org.robolectric:robolectric:2.3' androidTestCompile 'junit:junit:4.11' robolectricディレクティブの追加 robolectric-gradle-pluginのサンプルを利用してコピペします。
そのままだとGradle Syncがうまくいかないので、一部削除しています。
robolectric { // configure the set of classes for JUnit tests include '**/*Test.
久しぶりにAndroid Studioでサンプルアプリを作ろうとしたら、JDK7を使えと怒られてしまいました。
設定を確認すると、JDK6を使うように設定されていました。
Project Structureはcmd + ;で開きます。
JDKは1.8をインストールしていたはず・・・と思って確認すると、やっぱり1.8がインストールされていました。
コマンドプロンプトを開いてjava -versionでインストールされているJavaのバージョンが確認できます。(正確にはJREのバージョンの確認ですけど)
しかし、/System/Library/Java/JavaVirtualMachinesにはJDK6しかない。調べてみると、JDK1.7以降ではインストールされているディレクトリが異なる模様。
それぞれのJDKのディレクトリを確認するには、コマンドプロンプトで/usr/libexec/java_home -v バージョンで、JDKのバージョンごとのインストールされているディレクトリが確認できます。
とりあえずJDK7を使えというエラーメッセージだったので、JDK7のディレクトリを指定してやることでエラーメッセージが消えました。
ちなみに、JDK7はOracleのサイトからダウンロードできます。
Android Studio 0.8.12がCanary Channelでリリースされています。
Canary Channelでリリースといっても、今回はパッチ形式での配布ではないので通知がきていないかもしれません。今回のバージョンアップでは、新たにAndroid Studioをまるごとダウンロードする必要があります。(バグへの対応のため、パッチ形式による提供はできなかったそうです)
0.8.12での変更点 新しくなったAVDマネージャー 画面サイズが分かりやすく表示されているのがありがたいですね。見た目が今風になっているだけでなく、設定がしやすくなったように思います。
Gradle WrapperがHTTPSで通信するようになった Mavenのリポジトリ(JCenter)からライブラリを取得したりする際に、HTTPSで通信するようになったようです。セキュリティ面の強化ということなんでしょうかね。
レイアウトXMLエディターの初期画面をTEXTモードに 新しくレイアウトXMLファイルを作成した際に、エディタがグラフィカルモードではなくテキストモードで開かれるようになります。GUIでデザインなんかしないよという人にはありがたい機能かもしれません。
その他いろいろ string.xmlからTranslation Editorが開けるようになったり、新規プロジェクト作成時にプロジェクトビューがAndroid Project viewがデフォルトで選ばれるようになったり(今まではProject viewがデフォルト)しているようです。
詳細は0.8.12のリリースノートを参照してください。
以前のバージョンのAndroid Studioと共存させる方法 Macの場合の話ですが、今まで使っていたAndroid Studio.appの名前を変更するだけで、Android Studioの旧バージョンと新しいバージョンを共存させることができます。
分かりやすいようにバージョンを後ろに追記してやるのがいいと思います。名前がAndroid Studioと被らなければいいので、別にAndroid Studioあ.appとかでも問題ないです。
Page 16 of 19