日々精進

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

android

実機からログを取り出す

テスターが実機でアプリを動かしていたらアプリが落ちたといって実機を開発者のところに持ってきた場合。 アプリのログは/dev/log/mainに吐かれるのでこれを参照すれば良い。 参考: Google グループ

Androidで同時タップを禁止する

iOSでは各ボタンにexclusiveTouchを設定していくところだが、Androidは 一箇所Styleを設定するだけでOKっぽい。 以下のように設定する。 <style name="MyTheme" parent="@android:style/Theme.Holo.Light"> <item name="android:windowEnableSplitTouch">false</item> <item name="android:splitMotionEvents">false</item> </style>

ZipInputStream#readで読み込んだデータが途中で切れる

1KB程度以上のファイルをZipInputStream#readで読み込むと途中で切れてしまった。 原因はZipInputStream#readはファイルの最後までデータを読み込むことを保証していないため。 BufferedInputStreamを使うと最後まで読み込める。 コード例は以下。 ZipInputS…

AQUOS PHONE 104SHでFile.createTempFileを実行するとアクセス権が無くエラーになる

このようなコードではエラーが出た。 File tempFile = File.createTempFile("tempfile", ".zip"); 以下のように直すと直った。 File tempFile = File.createTempFile("tempfile", ".zip", context.getFilesDir()); やっぱAndroidは機種毎に挙動が違って大変…

Viewのwidth, heightをコードから変更する

カスタムViewGroupの子Viewのwidth, heightをコードから変更する場合、 setLayoutParamsを使えばいい。ただ、これを実行するタイミングはonMeasure実行以前でないといけない。 例えば、onLayoutはonMeasureの後で呼ばれるのでonLayoutの中でsetLayoutParams…

デシリアライズした時にtransientなフィールドを初期化する

transientなフィールドがデシリアライズした時にnullになるのを避けるには、readObjectメソッドの中でフィールドを初期化すればいい。 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject()…

build variant毎にアプリ名を変更する

manifestPlaceholdersを使ってbuild variant毎に異なる値をManifestに埋め込む。 build.gradleで以下のようにmanifestPlaceholdersを定義しておく。 productFlavors { staging { manifestPlaceholders = [appName:"@string/app_name_staging"] } } Manifest…

ビルドすると「Manifest merger failed : Attribute application@label value...」エラー

エラーメッセージにも書いてあるけど、「tools:replace="label"」属性を追加すると直った。 この属性を追加するとmanifestをマージするときに、属性がコンフリクトした場合どちらを採用するかを指定できるっぽい。 参考: Android Studio 6.0 merger fail

AndroidManifest.xmlのandroid:labelがapplicationとactivityの両方にある理由

以下引用。なるほどー。 <application>タグのandroid:label、android:icon 「Settting」‐「Applications」‐「Manage Applications」で表示されるアプリ一覧に表示される <activity>タグのandroid:label、android:icon Androidデスクトップに表示されるアイコンに表示される 参考: A</activity></application>…

Android標準のアイコンを使う

android:background=に続けて@android:drawable/と打って、後は自分が使いたいアイコンに含まれていそうなキーワードを入力すると候補が出てくる。 もしくは↓を使った方が探しやすいかも知れない(自分は使ってません) konifar/android-material-design-ico…

View Hierarchy上で、あるViewより下のViewにTouchEventを送らないようにする

Androidではデフォルトでは複数のViewが重なっている場合、下の方のViewにもTouchEventが送られるようだ。iOSはデフォルトで一番上のViewにしかTouchEventが送られない。 あるView以降TouchEvnetをBlockしたい場合はカスタムViewクラスを作って、以下を実装…

ScrollViewのheightをmatch_parentにしても、高さがcontentと同じになる

ScrollViewのheightを親と同じ高さにしたい場合は android:fillViewport="true" とすればいい。 参考: 【Android】ScrollViewで高さいっぱいに表示(fillViewport)|俺メモ Web時々アプリ | OREMEMO

CharlesでAndroidのSSL通信の中身を確認する

以下手順でSSL通信の中身を見られるようになる。 CharlesのメニューのProxy>SSL Proxy Settings...を選択する Enable SSL Proxyingにチェックをつける addボタンをクリックし、SSL通信するドメインを追加する Charles便利っすわー。 参考: Legacy SSL Proxy…

Android Studio 1.2 beta3でBuild VariantsがずっとLoading...のままになる不具合

原因はAndroid Studio Unit Testプラグインで、これをdisableにすると直った。 でも、これがないと単体テスト実行できないんだよな。。 早く不具合直ったバージョンが出て欲しい。。 参考: https://code.google.com/p/android/issues/detail?id=163314

potatotips#16発表資料(CustomViewTips)

potatotips#16に参加してきました。 発表資料は↓ http://hosokawa0825.github.io/slides/CustomViewTips/#/

build.gradleに「options.encoding = 'UTF-8'」を定義してもWindowsで文字化けする

build.gradleに以下を書いて文字コードをUTF8にしていたが、Robolectricでテスト実行時にテキストファイルを読み込むと文字化けするという現象が起きた。これはWindowsでのみ発生しMacでは文字化けしない。 tasks.withType(JavaCompile) { options.encoding …

Android Studioからビルドすると「Error:Android Gradle Build Target: org.gradle.tooling.GradleConnectionException: Could not execute build using Gradle installation」エラーはclean projectで直る

以下の記事でこのエラーは~/.gradleを削除すると直ると書いたが、メニューのBuild>Clean Projectを実行すると直るっぽい。 2015-03-10 - 日々精進 こっちの方が手間が少なくていいな。

一つのlayout xmlを複数includeした時にViewへの参照を取得する方法

parent.xmlにchild.xmlを複数回includeした場合、同じidのViewが複数できるがそれらへの参照をどうやって取得するか。例は以下。 parent.xml <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> </scrollview>

BundleのValueをすべて見る

デバッグ中にBundleの中身を見たい・・・という場合があるが デバッグウィンドウでbundle#mMapを見てもなぜか例外が発生して見れない。 BundleのkeyはBundle#keySet()で一覧を取得できる。 valueはBundle#getから取得するしかないっぽい。 見づらいけどBundl…

Bundle経由でFragmentにオブジェクトを渡すと参照渡しになる

FragmentAからFragmentBインスタンスを生成するときにBundleにオブジェクトを詰めて渡した場合、一旦SerializeされてFragmentB側でインスタンスが生成されるものだと思っていたが違うらしい。実際は参照が渡されるだけ。 ただし、OSにprocessをkillされた後…

CustomViewのlayout xmlにmergeタグを使うとレイアウトが崩れる問題

状況は以下 CustomView(名前はPositionView_)のlayout xmlのRootタグはmergeタグ <merge xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" > ... </merge> Fragmen…

文字列をBigDecimalに変換する時に、変換出来ない場合nullにする

文字列をtry parseしてparse出来る場合だけBigDecimalに変換したいという場合。 NumberFormatExceptionをcatchして握りつぶせば良い。 try { rate.setDecimal(new BigDecimal(json.getJSONArray(2).getString(0))); } catch (NumberFormatException e) { // …

AndroidStudioのdebug windowのオブジェクト詳細について

debug windowのvariablesやwatchesには以下のようにオブジェクトが表示される。 jp.co.sample.common.NumberPicker{43becbd V.E..... ......I. 0,0-0,0 #7f09007f app:id/rate_number_picker} この例の43becbdはhashCode、#7f09007fはandroid:idの値。 16進…

Android Studioのビルドが途中で止まる

Android Studioをリスタートしても、マシンを再起動してもだめという場合は、メニューの File>Invalidate Caches / Restart...を選択し、Invalidate and Restartをクリックすると直るかも。 最近Android Studioのビルドが不安定で困る。。

「java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference」エラー

原因は、fragmentをremoveすると、一瞬mFragmentManager.getFragments()で取得出来るListの要素にnullがある状態になるため。 以下のコードだとfragmentをaddしたりremoveしたりを繰り返すとNPEで落ちることがある。 for (Fragment fragment : mFragmentMana…

selectorリソースを使ってボタンの背景画像を切り替えられない

原因は、XMLファイル内の一番上にAttributeが付いていないitemを書いていたため。 selectorは上から順に評価されるので、常に一番上の画像を表示してしまっていた。 以下はだめな例。 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/common_sell_radio_button"/> </item></selector>

@hideアノテーション付きメソッドはリフレクションを使うと呼び出せる

@hideアノテーションJavadocコメントに付いているメソッドは参照出来なくなるっぽい? 少なくともActivity#isResumedは呼び出そうとしてもビルドエラーになる。 が、リフレクションを使うと呼び出せる。そんな無理矢理アクセスしてたらSDKの内部実装が変わっ…

1,000のようなカンマつきの文字列をBigDecimalに変換する

DecimalFormatを使う。setParseBigDecimal(true)でparseメソッドがBigDecimalを返すようになる。 DecimalFormat decimalFormat = new DecimalFormat(); decimalFormat.setParseBigDecimal(true); BigDecimal d = (BigDecimal) decimalFormat.parse(string); …

Android Studioからビルドすると「Error:Android Gradle Build Target: org.gradle.tooling.GradleConnectionException: Could not execute build using Gradle installation」エラー

原因は謎だが、~/.gradleフォルダを削除してgradleを再インストールすると直った。 Android Studio不安定で困る。。 参考: Gradle error: could not execute build using gradle distribution

選択中のタブがクリックされたイベントを検知する

TabHostインスタンス生成時に以下を実行すればよい。 // hostはTabHost型のフィールド変数 TabWidget tabWidget = host.getTabWidget(); for (int i = 0; i < host.getTabWidget().getTabCount(); i++) { View tab = tabWidget.getChildAt(i); tab.setOnTouc…