Android Studio
Google I/OでAndroid用統合環境が発表されました。
Early Access Preview版ということで、まだ正規版じゃありませんけど、流れに乗ってインストールしてみました。
downloadはこちら→Getting Started with Android Studio – Android Developers
いままでのEclipseベースではなく、IntelliJ IDEAベースでだいぶ見た目も変わってます。SDKも含めて、なんもかんもいっぺんに入っちゃう印象なので、今までのようにSDKいれてからプラグイン入れて…みたいな手順がなくなって便利。
環境によって、説明が変わってくるのとか、本当に面倒なのでこういう統一された環境があるのはありがたいことで。導入のハードルも下がって、いままで悩んでた人もAndroidStudioが出たらやってみてもいいんじゃないでしょうか。
UIデザインの画面ですが、最近のADTプラグインでも充実してきてるものになってきてますが、それと同じような感じかそれ以上にわかりやすいものになってるみたいです。というくらい、まだ、ちょっとしか触ってないんですけど。
既存のEclipseのプロジェクトを取り込むのは、なんか方法があるんでしょうけど、ソースとlayoutのxmlをエディタ上でコピーしちゃえばいいかとか思ってるところです。その辺りは、また手を付けたらまとめよう。
外部ライブラリなんかは、プロジェクトツリーから追加じゃないので、いろいろ調べちゃいましたが
android – How to add external library in IntelliJ- – Stack Overflow
に載ってた手順が参考になりました。
- Project Settingを開く(CTRL+ALT+SHIFT+S)
- Project Settingの下にあるLibrariesを選択
- 右のリスト(ウィンドウが3つに分かれてるので、その真ん中)の+からJavaを選ぶ
- jarファイルをいれたフォルダ(/libsとか)を選んで追加
- どのモジュールに追加するか選択
でいいみたい。コピーしなくてもフォルダやファイルを選択して取り込めるので、その辺りは従来通りかと。
インストールの手間が本当になくなったなーっていう印象ですね。
FragmentでAsyncTaskLoaderを使ってみる
ネットワーク経由でJSONファイルを取得する実装をしてたんですが、ネットワークアクセスのpermissionも設定しているのになぜか例外投げられてうまく動かなかったんですが、そういえばHoneyComb以降では、ネットワークアクセスをする場合、UIスレッド以外からという制約ができていて、それを回避するためにはAsyncTaskを使わないとダメですよという話を前に聞いたなーと思ったんで、AsyncTaskでネットワークアクセス部分を実装してみました。
しかし、受け取った内容をDBにいれてListViewにセットしたAdapterの更新どうすんだろうとしばらく悩んでたところ、AsyncTaskLoader使うと処理終わったときにUIスレッド側のcallbackメソッド呼べますよっていう話なんで、その方が楽そうなのでそっち使ってみることにしました。
まずは、いままで使っていたクラスの変更を。
extends AsyncTask<?,?,?>
になっているところを
extends AsyncTaskLoader<?>
に書き換え。
loadInBackgroundの引数は必要なくなるので削除。onStartLoadingが必要になるので追加。
loadInBackgroundで使っていた引数は、コンストラクタに引数で渡してメンバー変数に変更。
Fragment側にimplements LoaderCallbacks<?>を追加すれば、Eclipseの補完機能(unimplemented methodsとかいうアレ)で必要なメソッドのひな形が追加されるので、そこに今まであった処理(onLoadFinished)を移動。
onCreateLoaderには、AsyncTaskLoader用クラスのコンストラクタの呼び出しを書いて終わり。
このLoaderを呼び出す場合は、getSupportLoaderManagerを使うのでFragmentActivityを使うという説明を読んだけど、FragmentActivity使ってないし、Fragmentにはそんなメソッドがないのでダメなのかと思っていたら、getLoaderManagerというメソッドがあったので気にせずこちらを使ってみたら問題なく動いている。あとでメソッドの説明文読んだら、いっしょの文章だったから、気にしないことにした。
getSupportLoaderManagerもgetLoaderManagerも。・・LoaderManagerを取ってくるメソッドだから当たり前かもしれないけど、どちらもinitLoaderが使えるので、
getLoaderManager().initLoader(int, Bundle, LoaderCallbacks<?>)
で呼び出せば、別スレッドで処理が走る。
処理が終わったらcallbackでonLoadFinishedが呼び出される。
受け取ったデータをDBにいれたら、CursorLoader.loadInBackgroundを呼び出して、mAdapter.swapCursorでCursorを更新すれば、ListViewも更新される、と。
これで動いているので、この件は一応の決着。
Ruboto
Rubotoは、Android上でRubyを使うための環境です。
https://github.com/ruboto/ruboto
まだ日本語環境というか、日本語の資料がないので、手始めにgithubのReadme.mdを日本語訳しました。
Ruboto – Ruby on Android
インストール方法
$ gem install ruboto
はじめに
Rubotoを使う前に準備が必要です。以下の準備をするといいでしょう。
- JDKがインストールされていなければJDKをインストールします
- JRubyのインストール はとても簡単です。 rvm を使ったインストールもできます。
- Android SDKをインストールします。
- 環境変数 $ANDROID_HOMEにSDKの絶対パスを設定します。(Javaはチルダを展開しません)
- SDKのtoolsとplatform-toolsディレクトリを環境変数 $PATHに追加します。
- 実機で開発するのでなければ、Emulatorのイメージを作ってください。
概要
ruboto gen appのようにrubotoのコマンドラインツールを実行する場合、Rakefileは各アプリケーションフォルダのルートにおいてあるものとしています。
RakefileはJubyのrakeを実行するときに必要です。
コマンドラインツール
- Application Generator(railsのapplication generatorみたいなもの)
- Class Generator は、ActivityやBroadcastReceiver, Serviceなどの追加クラスを生成します。
- Callback Generator は、Android APIのいろいろな部品で必要となるcallback用サブクラスを生成します。
- Packaging task は、apkファイルにまとめます。
- Deployment task は、できあがったapkファイルをエミュレータや実機に対してdeployします。
- Updating Your Scripts on a Device(修正の度にコンパイルしなくても開発できます)
Application Generator
$ ruboto gen app --package com.yourdomain.whatever --path path/to/where/you/want/the/app --name NameOfApp --target android-version --min-sdk another-android-version --activity MainActivityName
Version番号は、必ず’android-‘とSDKレベルで指定します。(例: android-8 は froyo(2.2))
Class Generator
ruboto scriptと関連付いたJava classを生成します。(ActivityやServiceやBroadcastReceiverなど)
generatorは、一緒にテストスクリプトも生成します。
$ ruboto gen class ClassName --name YourObjectName
例)$ ruboto gen class BroadcastReceiver --name AwesomenessReceiver
Callback Generator
スクリプト内から、特定のAndroidAPIを操作できるようにするためのサブクラスを作ることができます。
rubotoからAndroidを処理するためのインターフェースが用意されたクラス一式を用意できます。
Ruboto 0.6.0からはもっと簡単にできるようになりました。interfaceやsubclassを用意する新しい方法は、WikiのGenerating classes for callbacks.の項を見てください。
Packaging task
apkファイルを生成します。
$ rake
apkファイルを生成して、実機やエミュレータへのインストールを一気にやるには次のようにします。
$ rake install
Deployment task
Playストアに公開する準備が整ったとしても、もう少しやることがあります。
まず、まだ署名用のキーファイルが手元に無いならば、keytoolを使って署名用のキーを作ります。
大抵の設定がデフォルトのままでいいならば、
$ ruboto gen key –alias alias_for_your_key
にオプションとして
–keystore /path/to/keystore.keystore
を指定して作りましょう。できたファイルは
~/.android/production.keystore
に保存されます。
このとき、keystore用と自分が使うキーのためにパスワードを聞かれます。この2つのパスワードは忘れないようにしてください。
キーはバックアップしておきましょう。(もし無くしてしまうとアプリケーションをアップデートしたときに古いバージョンからの更新ができなくなります)
キーの準備ができたら、
rake publish
として、playストアで公開できるapkファイルを作りましょう。
このとき、
RUBOTO_KEYSTORE
RUBOTO_KEY_ALIAS
という環境変数にkeystoreとkeyのaliasを設定しておきます。例えば、次のようにします。
$ RUBOTO_KEYSTORE=~/.android/production.keystore RUBOTO_KEY_ALIAS=foo rake publish
か
$ RUBOTO_KEYSTORE=~/.android/production.keystore
$ RUBOTO_KEY_ALIAS=foo
$ rake publish
それか、この2つの環境変数を~/.bashrcから登録するように設定して、rake publishを実行しましょう。できたapkファイルはplayストアへ!
Updating Your Scripts on a Device
従来の開発方法だと、ソースを変更すると再コンパイルして再インストールしないとダメでした。すげー遅いし、すげーだるい。
Ruboto使うと、スクリプトの変更をしてもJavaソースを更新しなくてもいいんです。Rubyスクリプトを書き換えただけだったら、次の呪文を唱えればいい。
$ rake update_scripts
そうすると端末にスクリプトの最新版がコピーされます。
ちゃんばらの時間がなくなっちゃってごめんね。
※注意
Rubyスクリプトの変更のときだけ、使えます。もし、Javaソースを書き換えた(新しいクラスを作った場合などは、ソースが生成されます)とかXMLファイルを書き換えたときなどはスクリプトの再コンパイルが必要になります。
書き込み禁止ディレクトリに書き込むなどの場合は、root権限が必要になります。そういうときのテストに使える一番簡単な方法は、エミュレータで試すこと。端末で動かすには、root権限がいるでしょうけど。
ListView.setFastScrollEnabled(true);の見た目違い
ListViewのスクロールは、たくさんあると結構な労力になります。で、それを補助するためににょきっと出てくるスライダーがあるんですが、2.3(GB)と4.0(ICS)では、出てくる物が違ったので、メモ。
左は、xperia neo(2.3.4)で、右はGalaxyNexus(4.0.3)です。
2.3.4ではにょきっとでるおなじみのアレですが、4.0.3では縦線+ちょい太めのスライダー。
なんか寂しい気がしますね。
ListViewに表示されてるのは、MH3Gのクエスト一覧です。
らんくえのMH3G版を作ろうとしてて、前回めんどくさくてやってなかったContentProvider使ったクエストリスト、今回はデータ作って実装しました。ContentProviderの動作とデータのチェックでListViewに一覧表示してます。
もう、3DSのモンハンも一段落しちゃってる人ばかりだったり、同じようなアプリが出てきてるのでリリースするかわかりませんが、DBの初期化とかアップデートの方法とか研究しながらなので一通り完成させてから考えますかね。
レイアウトもICSっぽく(?)-passgenを最新SDKに対応させる3
書籍収録分のPassGenは1.6を想定した作りになっているので、ボタンその他をすべてレイアウトから書き換えて見た目の変更なんかをやってました。
9patch画像を使いつつ、ボタンのデザインを変えてみたりといろいろ実験していたわけですが、今回は色合いなどはなるべくICSの基本構造に合わせて、UIパーツも差し替えていく感じでレイアウトを書き換えていきました。
使う文字種については、ON/OFFできるswitchと置き換えています。基本的な動きは以前使っていたCheckTextBox(ToggleButtonを継承した自前クラス)と変わらないので、プログラム的な書き換えはほとんど必要なかったです。
文字数の指定は、左右に配置したボタンをやめてSeekBarを使うことにしました。onProgressChangedイベントを使って、文字数表示を制御しています。
これ以外では、文字色を緑から蒼系統に書き換えたり、ActionBarを使ってメニュー項目を減らすなどの対応を行いました。ActivityからFragmentに書き換える部分などは、前回前々回の記事でまとめた作業をそのまま使ってます。
そんなわけで、見た目など含めて最新OSに対応したものになりました。2.3端末へのActionBar対応だとか、4.0の端末がそれほど存在しないとかいろいろとあるので、公開するかどうかは微妙ですけども。
startManagingCursorはdeprecated–passgenを最新SDKに対応させる2
昨日は「ActionBarにアイコンを追加してみた」という記事で最新UIに対応する見た目にする努力をしてみました。
そのときにソースを見ているとAdd @SuppressWarnings ‘deprecation’ to ‘setListViewAdapter()’なんていうのがちょこちょこと出てまして、なんでだろとリファレンスを見てみると次のようなことがわかってきました。
- startManagingCursorは、Fragmentとの兼ね合いもあってCursorLoader経由でUIスレッドではなくバックグラウンドで実行されるようになった
- SimpleCursorAdapterのコンストラクタには、フラグを追加する必要がある
- クリップボードにコピーするときにコピーした内容を識別するための名前とMIMEタイプを指定するようになった
そんなわけで、今日も対応した内容に書き換えていくことにします。
ActionBarにアイコンを追加してみた
ちょっとプログラムをする時間などもできてきたので、本が出てからかなり時間は経ってますが、怪しいAndroidアプリ開発術に掲載しているPassGenの画面構成を変えて、HoneyComb以上のライブラリで使われているActionBarにアイコンを表示するようにしてみました。
こんな感じ
保存と閉じるのボタンを画面上のバーに表示させています。なんとなく最新版のOSに対応したって気になる。
ドキュメントとしては、
辺りを見てもらえばいいかと思いますが、それだけじゃなんなので、対応方法など。