日々精進

新しく学んだことを書き留めていきます

android

ResourceIdからResourceNameを取得する

Contextの以下のメソッドを使うと取得できる。 getResources().getResourceEntryName(int resid); // または以下 getResources().getResourceName(int resid); 参考: How to get Resource Name from Resource id

RobolectricでExecutorServiceを使った非同期処理のテストを行う

またRobolectricのつらみ記事です。 非同期処理のテストを行う場合、Robolectric.runBackgroundTasks();を使ってBackgroundTaskを実行するが、ExecutorServiceを使って非同期にしている場合はrunBackgroundTasksが効かなかった。 ExecutorServiceのShadowと…

Robolectricでテスト実行時にassetsフォルダ・resourcesフォルダを複数設定する

こんなのよくやることだと思うのに、dirty hackな方法しか見つからなかった。。 もっとまっとうな方法はないんだろうか? RobolectricTestRunnerのサブクラス(MyTestRunner)を作る。 MyTestRunnerに以下を実装してassets/resourcesフォルダを追加する @Overr…

Mockitoで戻り値がvoidのメソッドをMockする

spyでやる場合は以下のように書く。 target = Mockito.spy(new MyClass(Robolectric.application)); // targetのcheckメソッドをMockにする。引数に何を渡されたときでもMockにしたい場合は // Mocito.<引数の型>any()を渡す。 doNothing().when(target).che…

Robolectricでテスト実行開始時に一度だけ処理を実行させる

Robolectricで単体テスト実行中にBuild.VERSION.RELEASEからOSのバージョンを取得すると、"unknown"が返ってくる。 これでは都合が悪いので、テスト実行開始時にBuild.VERSION.RELEASEを書き換えてやろうと思ったのが事の発端。これが結構大変だった。。 や…

potatotips#14発表資料(主にAndroid StudioのTips)

potatotips#14に行ってきます。発表資料は以下。 発表資料 もう14回もやってるんだねぇ。すごい。

Androidのレイアウトを作るときは横幅320dpと384dpでチェックすべき

Nexus Oneでアプリを表示するとレイアウトが崩れて悲しい思いをしたのでどうレイアウトを作ればいいか調べた。 dp単位でも端末によって横幅は多少違いが出るらしい。が、320~384に収まっているのでこの両端でチェックすればOKであろうという結論になった。 …

InstanceStateのsave, restoreを簡単に書けるIcepickが便利

使い方は下記記事参照。これでInstanceStateの取り扱いのダルさがかなり軽減されそう。 Android の罠 [1] ちゃんと onSaveInstanceState する - Qiita てかアプリの状態の復元ぐらいラインタイムの方でやってよ。。 フィールド変数が突然消えないiOSは幸せだ…

GenymotionのVMをコマンドラインから起動する

いずれalfred workflowを使って起動できるようにしたい。 手でやる場合の手順は以下。 VBoxManage list vmsでVMのリストを取得する /Applications/Genymotion.app/Contents/MacOS/player --vm-name ""でVMを起動する 手でやるんだったらGUIからやるわって感…

maven centralに登録されているライブラリを楽にbuild.gradleに追加する

Cmd+;でProject Structureを開き、Dependenciesタブを開き、+ボタンをクリックして表示されるウィンドウでmaven centralに登録されているライブラリを検索できる。 butterで検索しても何も表示されなかったが、butterknifeで検索したらヒットした。部分一致…

呼び出されたクラス、インスタンスのHash値、メソッド名をログに出すメソッドを実装する

ライフサイクルイベントがどんな順番で呼ばれているかなど調べるときに、メソッドにログを仕込むことは良くある。これを簡単に実装するには以下のようにする。getStackTrace()[3]の3の理由は0,1にはVMやthreadのメソッド名が入っているため。 public class M…

process killしてから、アプリを再起動した時にステップ実行する方法

Androidでは裏にいるアプリをOSがKillすることがある。この時の挙動をデバッグしたい場合の手順は以下。 エミュレータでアプリを起動する 設定>端末情報>ビルド番号を10回タップして開発者向けオプションを表示する 開発者向けオプションをタップし、「デバ…

Genymotionでキーボードから入力する

Genymotionでアプリを動かしているときに、 キーボードからアプリに文字を入力したい・・・と思いその方法を探してみた。 以下の手順で入力できるようになる。 Settings>Language & input>Defaultをタップする HardwareのところにあるswitchをONにする 下記…

Designtime Layout Attributesが便利

画面レイアウトを作るときに、Designtime Layout Attributesがめっちゃ便利だった。 CustomViewクラスを作っている場合はisInEditMode()を使ってちゃんとプレビュー出来るようにしておくことが大事。 XMLを修正→レイアウト確認→XML再修正のサイクルがかなり…

Androidで処理をメインスレッドにスイッチしつつDelayをかける

ある秒数だけ待ってメインスレッドである処理をしたい場合、HandlerのpostDelayedを使えば良い。遅延実行させるのにTimerオブジェクト使ってたけど、いらなかった。。 修正前のコードは以下。 retryTimer = new Timer(); retryTimer.schedule(new TimerTask(…

Genymotionを日本語化する

Settingアプリを起動>「Language & input」を選択>一番下に「日本語」があるので選択 で日本語になる。

nullをメソッドに渡しているところで「ambiguous method call」エラー

以下のようなメソッドが同じクラスに定義されている時、 setHoge(Integer num) setHoge(Double num) setHoge(null);を呼んでいるところでエラーになる。 原因はnullには型情報が無いので、どっちのメソッドを呼べばいいかが分からないため。 以下のように型…

MacのDiffツールはKaleidoscopeが良い

メリデメは以下。 メリット 3カラム表示でのマージが楽。↓のような感じ。コレに慣れると1カラムでマージとか良くやってたな・・・と思う。 マージ機能が賢いっぽい。GitTowerでコンフリクト○件と表示されたのをKaleidoscopeでマージしようとするとコンフリク…

Android StudioでPreview時に「failed to find style 'textviewstyle' in current theme」エラー

原因はアプリ独自のThemeを定義していたが、textviewstyleをその中で定義していなかったこと。 styleを一つずつ定義していくのは大変なので親Themeを指定して解決した。 styles.xmlは以下のような感じ。 <resources> <style name="AppTheme" parent="android:Theme.Black"> <!-- Customize your theme here. --> </style> </resources>

Androidで実行時に「java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare()」エラー

原因はbackground threadでUIを触るなどmain threadでしかできない操作をしていること。 下記記事の方法でmain threadで実行するようにすると直った。 2015-01-08 - 日々精進 参考: Androidでスレッド内でアラートを出すと

Androidでbackground threadからmain threadにスイッチする

やり方は以下。 Handerクラスのオブジェクトをmain threadで生成する background threadでhandler.post(Runnable)を実行するとRunnable#runの中がmain threadで実行される。 参考: Android: Accessing UI Element from timer thread

ListViewのItemの高さをlayout_heightに設定しても高さが変化しない

原因は恐らく以下。 ・mergeタグを使っている ・android annotationsを使っている CustomViewクラスを定義している場合、xmlではmergeタグをRootにする。 その場合AdapterのgetViewメソッドでinflateメソッドを呼ぶ時に、第三引数にparentを渡さないといけな…

genymotionからCharles経由でHTTPリクエストを出す

Genymotionで起動したエミュレータのプロキシ設定で、プロキシのホストを10.0.3.2にすればよい。ポートは8080。プロキシ設定の手順は以下参照。 検証機なし!Genymotionの導入でAndroidブラウザのデバッグが楽ちんに - Qiita 参考: How to access localhost…

匿名クラス内で親クラスのオブジェクトを参照する方法

クラス名.thisを使えばいい。 MyFragmentクラス内なら以下のようなコードになる。 messageDialog.setOnClickListener(new MessageDialog.OnClickListener() { @Override public void onClick(final Bundle param) { subscriber.subscribe(MyFragment.this); …

Android Studioで「Cannot find local variable」と表示されdebug windowでローカル変数の中身を見られない

テストカバレッジを出力する設定をOFFにすると直った。 具体的にはbuild.gradleの以下をコメントアウトした。 buildTypes { debug { testCoverageEnabled = true } } 参考: https://code.google.com/p/android/issues/detail?id=78045

CustomViewをlayout xmlで使うと「Binary XML file line # : Error inflating class」エラー

原因はコンストラクタが足りないこと。 下記のコンストラクタは必ず定義しないといけない。 public CustomView(Context context){ super(context); } public CustomView(Context context,AttributeSet attrs,int defStyle){ super(context,attrs,defStyle); …

Android Studioでビルドしたら「Error:Gradle: A problem occurred configuring project ':app'. > Failed to notify project evaluation listener. > PermGen space」エラー

原因はメモリ不足っぽい。 gradle.propertiesに以下を追加すると直った。 org.gradle.jvmargs=-XX:MaxPermSize=1024m 参考: Android Studio Gradle Issue: OutOfMemoryError: PermGen space

Activityのテストコードを実行すると「java.lang.RuntimeException: Could not launch activity」エラー

原因はマニフェストにテスト対象のactivityを追加していないことだった。 正確に言うと、マニフェストファイルで指定しているのはAndroidAnnotationsで生成したアンスコ付きのクラスで、テストコードから生成しようとしているActivityクラスはアンスコ無しの…

RobolectricとEspressoを同じプロジェクトで併用する

以下リポジトリで併用しているので、これを参考にビルド設定を変更すればいけた。 freezy/android-seed これでロジックのテストもUIのテストもやりまくれるぞー

genymotionにproxyを設定する

以下記事にgenymotionにproxyを設定する方法が書かれていたので参考にさせて頂きました。感謝! 検証機なし!Genymotionの導入でAndroidブラウザのデバッグが楽ちんに - Qiita