サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Wikipedia
star-zero.medium.com
Photo by Eugen Str on Unsplash使っていきたい便利なktxのメモ。 core-ktxandroidx.core:core-ktx:1.1.0-alpha05Context.getSystemService型を指定するだけなので、キャストとかService名が不要になる val alarmManager: AlarmManager = getSystemService()!!SharedPreferences.editラムダ式のなかで値を設定するだけ preferences.edit { putString(KEY, "value") }String.toUriStringからUriへの変換 val uri = "https://www.google.co.jp/".toUri()bundleOfPairからBundleを生成。型から putXXX の呼び出しを判
Google I/O 2019で発表された Internal app sharing が便利そうだったので実際に試してみました。 事前準備Play Consoleでアプリを公開しておくて(内部テストだけも可能)テスターを設定しておく(後述)Android端末にてPlayStoreアプリで開発者モードになる (Playアプリの設定から、 Playストアのバージョン を7回タップする)Playアプリで、設定の 内部アプリの共有 をONにするテスター設定Play Consoleで対象のアプリを開く開発ツール -> 内部アプリ共有 を開くテスターの管理 タブでテスターを設定する テスターの管理テスター設定時の注意ですが、該当のテスターがPlayStoreで対象アプリをダウンロードできる必要があります。 例えば、内部テストしか公開してないときは、オプトインURLでPlayStoreでもダウンロードで
FragmentでLiveDataをobserveするときに渡すLifecycleOwnerをFragment自身を渡してることがあると思うんですが、このときattachとdetachを繰り返すと問題が起こる場合があります。 例えば、以下のようなコードです。onActivityCreatedでobserveメソッドにthisを渡しています。 このFragmentをdetachして再attachすると、予期せぬ問題が起こることがあります。 detachではFragmentのインスタンスは破棄されておらず、またattachしたときに再びonActivityCreatedが呼び出され、またobserveしてしまうことになります。 具体的には複数のObserverインスタンスが作られることにより、メモリを消費したり、複数通知を受信する場合もあります。 これを防ぐにはFragmentに用意されてるg
Navigation UIの設定ActionBarとNavigationを連携させる設定がまず必要になります。細かい説明は省略します。ドキュメントを見てもらえると。 Toolbarの場合は以下のような感じです。ただし、 setSupportActionBar をやってると最初のFragmentのタイトルがうまく設定されないので、注意してください。
ViewModelを使うことで画面回転等のConfigurationが変更されたときもデータを保持することが可能になりました。しかし、OSからプロセスKillされてActivityの再生成に対応できません。 この場合は onSaveInstanceState を使うことで対応することになります。 ほとんどケースでUIの状態はViewModelと多いので、このあたりもViewModelのほうで対応できたらだいぶ楽になると思います。 これを SavedStateHandle というのを使って保存と取得を行えるようになりました。 まだalpha01なので今後変更はあるかもしれませんが。 環境implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01'実装ViewModel定義
ぼくがやってるAndroid開発についての情報収集を簡単に紹介します。 RSSがあるものは、Feedlyに雑に突っ込んで定期的に確認してます。 Redditandroiddev を日々チェックします。 だいたいココを見てれば最新の情報は集まりますし、たまにGoogleの人が質問に答えてたりするので面白いです。 ぼくは英語が得意ではないですが、気になるものは頑張って読むようにします。 公式ブログhttps://android-developers.googleblog.com/https://medium.com/androiddevelopers上のほうが何か新しい発表やお知らせ的な内容ですが、下のmediumのほうはもっと技術よりというか、中の人によるコードの説明だったりします。 Android Studio Release Updates
Navigationでバックキーを押したときに、どこまで戻るかを制御することが可能です。 これは何故かドキュメントに記載がありません。 環境implementation "android.arch.navigation:navigation-fragment-ktx:1.0.0-rc02" implementation "android.arch.navigation:navigation-ui-ktx:1.0.0-rc02"サンプル PopUpToバックキーを押したときにどこのFragmentまで戻るかを制御できます。 nav_graph.xmlでは次のように定義します。 action タグで対象の遷移先でバックキーを押されたときにどこまで戻るかを popUpTo で指定できます。 この例では、3つ目のFragmentでバックキーを押すと最初のFragmentまで戻ります。 Inclus
Callback形式はそのままだと、Coroutinesで手続き的に処理するのができません。それをうまくCoroutinesで扱えるようにする方法です。 サンプル例例として、以下のようなインターフェースのものをCoroutinesで扱えるようにしてみます。 Callbackなので、成功したとき・失敗したとき、それぞれのメソッドが呼ばれます。これだけではCoroutinesでは扱いにくいので、これを対応します。 Coroutinesに対応する対応方法はそんなに難しくなく、 suspendCoroutine を使うことで対応できます。 拡張関数として、 suspendCoroutine で囲んであげて、そこに渡される Continuation の resume または resumeWithException を読んであげるだけです。 Coroutinesで実行するあとは先程作った拡張関数を使う
suspend関数内でwithContextでDispatcherを切り替えてるものも、同様に runBlocking で囲むだけです。 注意として Dispatchers.Main だけはエラーになります。次で対応方法を見せます。 Dispatchers.Mainテスト対象。先程のは IO を使ってましたが、今回は Main を使ってます。 Dispatchers.Main を使った場合はそのままテストを実行すると以下のようなエラーメッセージが表示されます。 java.lang.IllegalStateException: Module with the Main dispatcher had failed to initialize. For tests Dispatchers.setMain from kotlinx-coroutines-test module can be use
2019年1月におけるAndroid開発状況について簡単にまとめておきます。 ぼくが感じる個人的見解なので、人によっては違う印象だと思います。あくまで参考程度にしてもらえると。 Kotlinおそらく、ほとんどのプロジェクトがKotlinで書かれてると思います。新規プロジェクトでJavaを選択するのはかなりレアなのかと思います。 公式ドキュメントもKotlinでの記述が増えてますし、ktxとして便利な拡張関数も提供されてます。 Coroutines去年正式にリリースされたCoroutinesですが、まだ無理に入れる必要はないかなと思っています。特に既存プロジェクトに関しては。 新規プロジェクトに関しては導入するのもアリだと思いますが、必ずチームで相談しましょう。 Jetpackも対応が進んでるので、いずれはCoroutinesが当たり前になるかもしれません。 今すぐ慌ててやる必要はないと思い
例えば、次のような感じのJSONをパースしたいときにどうするか? [ { "type":"rectangle", "width":100, "height":200 }, { "type":"circle", "radius":50 } ]typeによってJSONの構造が異なっています。これをmoshiでパースしてみます。 build.gradleimplementation "com.squareup.moshi:moshi:1.8.0" implementation "com.squareup.moshi:moshi-adapters:1.8.0" kapt "com.squareup.moshi:moshi-kotlin-codegen:1.8.0"ここで moshi-adapters というのを追加しています。 data class sealed classを使って、それぞれRec
Everything you need to get started with secure communication and encrypting files in one simple package leveraging the… GPG Key作成GPG Keychain を起動して、メニューのファイルから 新しい鍵... を選択します。 下のように入力して、鍵を生成します。メールアドレスはGitHubで登録してるものを入力します。 鍵を生成時にパスワードが弱いとダイアログが表示されます。パスワードを変更するか、そのまま進めるかを選択する必要があります。
BottomNavigationViewとNavigationを使った場合、特に何もしないとタブを切り替えるたびにFragmentが再生成がされることになります。おそらくDrawerLayoutも同様ですね。 これを再生成することなく切り替えるようにしてみます。これは比較的に簡単にできます。 Navigation自体の基本的な使い方は省略します。 環境android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha04android.arch.navigation:navigation-ui-ktx:1.0.0-alpha04Navigator実装FragmentNavigator を継承して、Fragmentの切り替え方法を変更します。 通常はここで毎回Fragmentが生成されてFragmentの切り替えが行われますが、それを状態を
Jetpack Navigationをカスタマイズする方法です。 この記事を参考に、Fragmentでの画面遷移ではなく、Viewの切り替えによる画面遷移をやってみました。 Navigationのカスタマイズは、 Navigator と NavHost を実装する必要があります。 build.gradlektx使ってます。 NavHost実装NavHostはカスタムViewとして作成し、 NavController を管理します。 次のようなことを行います。 Navigation.setViewNavController を使ってViewのタグにNavControllerをセット。NavControllerの navigatorProvider にカスタマイズしたNavigator(後述)を追加。XMLの属性からNavigation設定を取得して、NavControllerに設定。NavC
UPDATE⚠️Sorry, This article is not recommended!! Do not use this!!⚠️ SingleLiveEvent has a problem that it’s restricted to one observer. I created NEW SingleLiveEvent which can be observed multi observers in a simple way. This is easier than Event which is mentioned in this article. (Sorry, it’s bad class name🙇) Using this new class is just the same using SingleLiveEvent. val event = SingleLiveEv
Today, we launch an early preview of the new Android extension libraries (AndroidX) which represents a new era for the… で、ここから色々試したメモです。 Gradleプラグイン先程のAndroid Developers Blogに書いてる通り、androidxへの変換はAndroid Gradle Plugin 3.2.0-alpha14がやってくれてます。 Refactor to AndroidX... をすると、 gradle.properties に以下の2行が追加されます。 android.enableJetifier=true android.useAndroidX=trueコードが無いので推測ですが、このプロパティを見てGradleプラグインが変換しているよう
ちょっとやっかいな部分もあったので、LiveDataのテストをどう書くのかまとめました。 build.gradle必要なものを追加します。LiveDataを使うので、もちろんArchitectureComponentを追加してます。 mockito-kotlin はmockitoをkotlinでいい感じに使うやつです。mockitoをそのまま使うとNull Safetyが影響したりするので、入れておくと良いと思います。 core-testing はLiveDataをテストする上で必要なものがあります。 同期処理テスト対象単純なViewModelをテストしてみます。この例だと、 fetchNameが呼ばれたらLiveDataに文字列を流してるだけです。 16行目: ここでは、Observerのmockを作成しています。mockitoを使って最後にverifyで値をチェックするためです。 17
Robolectricのインストールとかは省略 Offlineのgradle設定ファイルrobolectricのoffline設定とjarのダウンロードのタスクの設定したファイルをプロジェクト直下に配置します。ファイル名は prepare-roborectric.gradle にしてます。 この例だと、 .robolectric-dependencies というディレクトリにjarをダウンロードします。 dependencies に依存のjarを設定するのですが、これがテストの設定とかで微妙に異なります。 確認する方法です。後述するapp/build.gradleの設定をまだしない状態でやってください。 最初に ~/.m2/repository/org/robolectric が存在する場合は一度削除しておきます。次に ./gradlw testDebug -d を実行します。ログがたくさ
Examples: Sets the length of time that changing modules will be cached. Gradle caches the contents and artifacts of… 依存関係は以下のようになります。 +--- com.squareup.okhttp3:okhttp:3.10.0 | \--- com.squareup.okio:okio:1.14.0 \--- project :mylibrary \--- com.squareup.okhttp3:okhttp:3.9.1 -> 3.10.0 (*)mylibrary側のバージョンが変更されてapp側に合わせられてます。 appとmylibraryのバージョンを逆にした場合も同様に、低いほうが新しい方へ変更されます。 +--- com.squareup.okhttp3:o
Hyperion-Androidという、だいぶ便利そうなのを見つけたので紹介します。 ※まだちょっとサンプルを試した程度なので、何か問題はあるかもしれません。 以下のページを見てもらえればある程度分かるとおもいますがViewをデバッグしたり、他にも色々できたりします。
DataBindingの @InverseMethod の使い方について簡単に紹介します。 使いどころとしては2-way bindingで表示する時、値を受け取る時に変換をしたい場合に使います。 サンプル簡単なサンプルとして性別を選択するSpinnerを用意して、それとenumで定義したものを2-way bindingで受け渡し出来るようにしてみます。 enum単純なenumの定義です。 InverseMethod@InverseMethod を使って、Spinnerに表示する時と、値を受け取る時に変換するstaticメソッドを作ります。 toInt メソッドは表示時にenumの値をIntに変換して返しています。これがDataBindingで画面表示時に呼び出されます。 このメソッドに @InverseMethod をつけます。アノテーションの引数には値が変更されたときに呼び出したいメソッ
Dagger is a fully static, compile-time dependency injection framework for both Java and Android. It is developed by the… Android拡張とは今までのやり方だと、コピペのコードが多かったり、Injectを行うクラスが依存解決する方法を知ってるとか、なんとか…っていう問題があるので、なんとかしようってことです。 ぼくの理解としては AndroidInjection.inject でシンプルに依存性の注入をやっていこうっていう雑な解釈でいます。そのための準備がだいぶ複雑ですが。 なので、 AndroidInjection.inject でちゃんと依存性の注入ができるようにするためにどう定義していくかということになります。
判断迷ってます。何か間違ってたら教えてください。 ライブラリにKotlinを使ってる場合、アプリ側に多少デメリットがあります。 アプリサイズKotlinを使ったライブラリを依存関係に追加すると、こんな感じにKotlinのランタイムのライブラリも入ってきます。 \--- project :libkotlin \--- org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.21 \--- org.jetbrains.kotlin:kotlin-stdlib:1.2.21 \--- org.jetbrains:annotations:13.0アプリ側がJavaの場合は、その分、単純にアプリサイズが増加します。 とは言え、ライブラリ自体そんなに大きくないので、すごく増えるということはなさそうです。 ココに書いてる通り、全部で約934KBで、Proguardを使うと
AOSPからDataBindingのコード取得方法とデバッグ方法について簡単にまとめておきます。 DataBindingと書いてますが、依存してるAndroid StudioとGradle Pluginあたりのコードも取得します。 環境mac OS High SierraSetupコードを取得する前に事前準備をします Disk Image作成Macは通常、ファイル名の大文字と小文字を区別していません。そのため、問題が発生することがあります。 なので、大文字と小文字を区別するDisk Imageを作って、それをマウントして使います。 以下のコマンドで作成します。容量は80Gとしています。 $ hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 80g ~/android.dmgこれを実行すると、 andr
これはReactiveStreamsのPublisherをLiveDataに変換したり、逆にLiveDataをReactiveStreamsに変換したりできます。 これを使うことで、RxJava2のFlowableをちょっといじるだけで、そのままDataBindingで使うことができます。 サンプルbuild.gradleimplementation "android.arch.lifecycle:extensions:1.0.0" implementation "android.arch.lifecycle:reactivestreams:1.0.0" implementation "io.reactivex.rxjava2:rxjava:2.1.7"ViewModelボタンを押すとカレントミリ秒を表示するだけです。(RxJava使う必要性はまったくないですが…)
kotlinでDataBindingを使う場合、Javaの時とは異なり、kaptでcomplierを指定する必要があったと思います。 kapt 'com.android.databinding:compiler:x.x.x'それが、AndroidStudio3.1 Canary8 から、これを書かなくても大丈夫になりました。 ただ、 apply plugin: 'kotlin-kapt' は必要です。 実はこれと同じことをするパッチ投げてたんですが、ちょっと放置されてる間に実装しちゃったみたいで。 https://android-review.googlesource.com/c/platform/tools/base/+/542002#message-a1d7b57c31a80c86c346c897e794e4f2332eb05b ぼくの実装と違うらしいので、コードが気になります。
ViewController.swift普通の設定です。 rowHeight には UITableViewAutomaticDimension を設定して自動で高さを計算するようにしています。 CustomCell.xibCellのレイアウトです。適当に右寄せで画像を表示してAutoLayoutを設定します。UIImageViewのContentModeは AspectFit にしてあります。 AutoLayoutは左側を >= で設定して、あとは、 Aspect Ratio を設定してます。この比率の制約はIBOutletとしてコードから使用します。その他は普通にマージンを設定しています。 CustomCell.swiftCellのコードです。IBOutletでUIImageViewと比率の制約を関連付けます。 画像ライブラリにはNukeを使ってますが、他のライブラリでも似たような感じに
Paging LibraryはRoomだけではなくAPIでも使えるので、実際に簡単なサンプルを作って試しました。 build.gradleVersionは1.0.0-alpha4–1 使っています。 implementation "android.arch.paging:runtime:1.0.0-alpha4-1" implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0'DataSourceまずはデータを取得する箇所からです。 DataSourceには PageKeyedDataSource , ItemKeyedDataSource , PositionalDataSource の3つが用意されています。 今回は
簡単に言うとSwift版Mockitoです。 ちょっと設定とかややこしい部分あるので、そのあたりも含めて簡単に紹介します。 Cuckooインストール今回はCarthageでインストールします。Quickと同じインストールの方法でやります。 CarthageCartfile.private というファイルを作って以下のようにします。 github "SwiftKit/Cuckoo"で、インストールします。 $ carthage update --platform iOSBuild PhasesXcodeでテストターゲットのBuild Phasesの Link Binary With Libraries にFrameworkを追加します。 Copy Files設定ちょっとここからが特殊です。GitHubのドキュメントとは少しやり方変えてます。スクリプトの引数にファイルを指定するのではなく、In
次のページ
このページを最初にブックマークしてみませんか?
『Kenji Abe – Medium』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く