前人未踏の領域へ アプリ開発編

Android, iOSアプリ開発に関する調査メモ置き場。ほとんどAndroid。はてなダイアリーから移行したため古い記事にはアプリ以外も含まれます。

R8でNullPointerException

課題

Android Stuio 3.5からはProguardよりもR8推奨ってことでR8を有効にした状態で リリースビルドをしようとしたらビルド中にNullPointerExceptionが発生してビルドできなかった。

対応

ググった感じだとOkHTTPを入れているとバージョンによっては発生するらしい。
R8の最新バージョン使えばいけるかな、ということで プロジェクトの build.gragleに以下を追記してみたらビルドが通った
com.android.tools:r8com.android.tools.build:gradle よりも上に書かないといけないらしい(未確認)
kotlinx-metadata-jvm はR8の依存関係で必要

buildscript {
    repositories {
        maven { url 'https://dl.bintray.com/kotlin/kotlinx/' }
    }
    dependencies {
        classpath 'org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.0.5.1'
        classpath 'com.android.tools:r8:1.4.93'
        classpath 'com.android.tools.build:gradle:3.5.0-beta01'
    }
}

備考

Instant Runを無効にすれば問題が発生しないという意見も見られた。未確認だがリリースビルドするときだけならそちらでも良さそう。

参考

github.com

https://issuetracker.google.com/issues/129738209

onActivityResultの呼ばれるタイミングとFragmentについて

課題

Fragment.onCreateViewでViewを生成しているが、onActivityResult内でそのViewを使用しようとした際にエラーになるケースがある。

原因

通常Fragment.onActivityResultはActivity.onStart前に実行され、それまでにはFragment.onCreateViewは既に実行されているため問題とはならないが、 呼び出し元のActivityが破棄されていた場合、Fragment.onActivityResultが呼ばれた後でFragment.onCreateViewが実行される。 そのためViewは取得できずにFragment.onActivityResult内で使おうとするとエラーになる。

対応

onActivityResult内でViewへのアクセスを止める。Fragmentのプロパティとして状態変数を持ち、その値を変更しておく。 onCreateView実行後にその値を元に表示を切り替える。

dpに対応する実際のピクセルサイズを得る

課題

指定したdpサイズに対応する、端末の解像度に応じた実際のピクセルサイズが知りたい。

対応

dimens.xmlを使う。

<resources>
    <dimen name="user_icon">40dp</dimen>
</resources>
var size = context.resources.getDimensionPixelSize(R.dimen.user_icon)

関連

takerpg.hatenablog.jp