20190526のKotlinに関する記事は4件です。

SimpleDateFormatでParseExceptionが出るときの確認点

Rssフィールドから日付を取得していたら、parseExceptionが出ました。

parseExceptionが起こった時の確認点をまとめたいと思います。

エラーは下記になります

java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:161)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.text.ParseException: Unparseable date: "Fri, 24 May 2019 13:10:14 +0900"
        at java.text.DateFormat.parse(DateFormat.java:362)
    // (省略)

①形式はあっているか?

Rss.kt
val formatter = SimpleDateFormat("EEE, dd MM yyyy HH:mm:ss z")

最初に上記のように記載してしまいました。
リファレンスを見てみると、形式に誤りがあることがわかりました。

文字 説明 使用例
y yyyy = 2019
yy = 19
M MMMM = July
MMM= Jul
MM = 07
M = 7
H 時間 HH = 08
m mm=20
s ss= 58
z General タイムゾーン JST
Z RFC 822 タイムゾーン +0900
a AM/PM AM
k 1日の中での時間 13
K AM/PMの中での時間 01

上の表によると、MMという部分と、zの部分を間違っていました。
大文字・小文字で意味が全く違うものもあるので、要注意です。
下記の形式でパースできるはずです。

Rss.kt
val formatter = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z")

②環境依存はないか?

①だけだと不完全です。
パースしてみると下記が出力されます。

金, 24 5 2019 13:10:14 +0900

曜日が日本語表示になっていました。
デフォルトが日本語になっているようでした。
SimpledateFormatで形式を設定するときにロケールを設定する必要があります。

Rss.kt
val formatter = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US)

うまくパースできないときは上記のことを確認してみるといいかもしれません。

参照

Android Developers SimpleDateFormat
SimpleDateFormatクラスparseメソッドのLocaleに注意

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Kotlin】ボタンのタップ領域のみを拡張する

ボタンのサイズを変えずにタップ領域のみを拡張するという要件を実装していてハマったので備忘録として記事に残します。

コードだけ知りたいという方はこの記事の最後の方に載せていますのでそちらを確認してください。

タップ領域_expanded.png

どうやって実現するか

TouchDelegate を使って実装します。
公式リファレンスはこちら

上記の公式レファレンスで

Helper class to handle situations where you want a view to have a larger touch area than its actual view bounds.

と記載があるので今回の要件を実装する際の正攻法だと思います。
他にも良い方法がありましたらコメントで教えていただけると嬉しいです。

TouchDelegate

TouchDelegate を使って何をしているかというと
「タップ領域を拡張したいView(この例だとボタン)の祖先のViewに対して拡張したタップ領域(図のピンクの領域)を指定して、この領域内でタップイベントが発生した時の処理をタップ領域を拡張したいView(この例だとボタン)に委譲する」

ピンクの領域をタップした時の処理を、ボタンをタップした時の処理として扱う

ということをやっています。
ここでの注意点は、ピンクの領域を指定する祖先のViewにクリック処理を実装していた場合、ピンクの領域をタップしてボタンの処理が実行された後祖先のViewのクリックイベントが反応しなくなるという点です。

TouchDelegateを使ってみる

前置きが長くなりましたが実際に TouchDelegate を使ってみます。
ピンクの領域は祖先のViewに対して指定できるので、ボタンから見て階層が上のViewであれば利用できるのですが、個人的には親のViewに対して指定するのが良いかなと思います。
何故かというと、

ピンクの領域の座標をTouchDelegateを指定する祖先のViewからの相対座標で指定する必要があるからです。

注意点.png

※実際にタップ領域を拡張する時は ConstraintLayoutFrameLayout に対して指定する場面が多いと思うので親ViewGroupとしてますがViewでも大丈夫です。

コード

コードはこんな感じになります。

ViewEx.kt
func View.expandTapArea() {

    val parentViewGroup = this.parent as ViewGroup
    parentViewGroup?.post {

        val rect = Rect() // <- ピンク領域のRect

        // ピンク領域のRectを生成

        parentViewGroup.touchDelegate = TouchDelegate(rect, this)
    }
}

// 使い方
button.expandTapArea()

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

最近(2019/05)のAndroid開発でよく使われているっぽいライブラリまとめ

私は去年から真面目にAndroid開発を始めたのですが、プロダクトの開発で息するように使われているライブラリなどは誰も教えてくれず知るまでなかなか時間がかかりました。この記事ではこれからAndroid開発を始める人向けに今よく使われているライブラリをまとめます。

「よく使われている」は完全に主観です。

AAC

Android Architecture Componentsの略で、Android Jetpackのコンポーネントの一つです

https://developer.android.com/jetpack?hl=JA

AACに含まれるライブラリの中でも特によく使うものについて紹介します。

Data Binding Library

https://developer.android.com/topic/libraries/data-binding/?hl=JA

文字通りデータバインディングに使うライブラリです。私はMVVMでの開発でよく使ってます。XMLにオブジェクトをバインドしたり、後述するLiveDataなどで双方向のデータバインディングもできるので大変便利です。

Lifecycle

https://developer.android.com/topic/libraries/architecture/lifecycle?hl=JA

ActivityやFragmentのライフサイクルを管理します。LifecycleObserverを使うとActivityやFragmentのライフサイクルイベントを他のクラスで監視することができるのでとても便利です。

LiveData

https://developer.android.com/topic/libraries/architecture/livedata?hl=JA

LiveDataはライフサイクルと連動して、値の変更を通知することができます。私はRxのSubjectを使ってレイヤー間の通知を行っていた部分をLiveDataに置き換えました。双方向のデータバインディングにも利用できて便利です。

Room

https://developer.android.com/topic/libraries/architecture/room?hl=JA

RoomではSQLiteをスムーズに使えるようなインターフェースを提供しています。私はそこまでがっつり使ってないのでなんとも言えません。

ViewModel

https://developer.android.com/topic/libraries/architecture/viewmodel?hl=JA

ViewModelはActivityやFragmentのライフサイクルと関連づけてUI関連のデータを管理することができます。いわゆるMVVMのViewModelとは文脈が少々異なる物だと思いますが、MVVMでのアプリケーション開発にはとても役立ちます。私はめちゃくちゃ使っています。

その他

  • WorkManager
    • ぶっちゃけ使ったことないので知りません
  • Navigation
    • 遷移周りを管理します。safeArgs(Fragment間でのデータ受け渡しに使えるモノ)が便利だった
  • Paging
    • ぶっちゃけ使ったことないので知りません

通信周り

okhttp + retrofit + RxJava(RxKotlin) + RxAndroid + moshi(gson) みたいな構成をよく見ます。 最近はcoroutineを使った非同期処理もよく見かけます。

HTTPクライアント

okhttp

https://github.com/square/okhttp

デファクトでしょう。私はこれが無いと生きていけないです。

retrofit2

https://github.com/square/retrofit

RESTをいい感じに扱えるライブラリ。okhttpと一緒に使うことが多し。

JSONパーサ

一昔前はJacksonが使われていたらしい?

gson

https://github.com/google/gson

google製です。よく見ます。私はDeserializerを自分で書かなきゃいけない時など複雑な要件の時に使ってます。

moshi

https://github.com/square/moshi

square製です。最近は専らこっちを使ってます。

kotshi

https://github.com/ansman/kotshi

kotlin実装です。kotlin向けのMoshiのadapter。

画像

glide

https://github.com/bumptech/glide

画像表示には欠かせない存在です。よく見ます。

picasso

https://github.com/square/picasso

こっちもよく見ます。体感的にはglideの方が使われてそう。

Rx

RxJava

https://github.com/ReactiveX/RxJava

リアクティブプログラミングというパラダイムのコード記述ができます。学習コストは高いですが覚えると大変便利です。非同期処理用のライブラリだと思われがち。最近は他の技術に置き換える流れを感じますがまだまだ色んなところで使われているし個人的にはこれが無いとかなり辛い。

RxKotlin

https://github.com/ReactiveX/RxKotlin

RxJavaのKotlin拡張です。KotlinでRxを使うならぜひ導入しましょう。

RxAndroid

https://github.com/ReactiveX/RxAndroid

Android開発におけるRxJavaでの非同期通信には欠かせない存在です。

RecyclerView

groupie

https://github.com/lisawray/groupie

最近人気すぎて怖い。でも確かに便利です。

epoxy

https://github.com/airbnb/epoxy

airbnb製。ぶっちゃけ使ったこと無いのでよくわかりませんが便利そう。MvRxや他のairbnb製のライブラリと相性が良さげです。

デバッグ関連

Log代替

timber

https://github.com/JakeWharton/timber

android.util.Logのラッパーです。誰も教えてくれないけどみんな使ってます(主観)。ビルドタイプによる機能の切り替えなどができます。

メモリ管理

leakcanary

https://github.com/square/leakcanary

信頼と実績のsquare製。アプリのメモリリークを検出し、通知します。当たり前のように使われている感じがします。

通信ログ周り

stetho

https://github.com/facebook/stetho

okhttpに噛ませるとChromeで通信ログなどが見れます。めちゃ便利。

flipper

https://github.com/facebook/flipper

Facebook製。Android以外のプラットフォームでも使えます。使ってる人見たことないです。stethoで良くね?

その他

Hyperion-Android

https://github.com/willowtreeapps/Hyperion-Android

色々できます。詳しくはこちらの記事を見てください。

DI

Dependency Injectionの略です。最近は知ってて当たり前感があります。参考

dagger2

https://github.com/google/dagger

square発google製。めちゃくちゃ使われてます。学習コストはかなり高いと思います。

koin

https://github.com/InsertKoinIO/koin

kotlin実装のDIライブラリ。知名度も上がってきて勢いを感じます。daggerよりわかりやすいので私は好きです。

テスト周り

mockito

https://github.com/mockito/mockito

モッキングフレームワークです。デファクト感があります。

mockk

https://github.com/mockk/mockk

kotlin実装のモッキングライブラリです。最近見かけるようになりました。

その他

ThreeTenABP

https://github.com/JakeWharton/ThreeTenABP

Androidで日付を簡単に扱えるライブラリ。誰も教えてくれないけど大変便利で使ってる人も多いはず。

所感

  • Java -> Kotlinの流れを強く感じます(koinとか)
  • 最近のAndroid開発ではdaggerやRxなど学習コストの高いものを覚える必要があり、開発を始める敷居が高くなっているように思います
  • 「これはみんな使ってるっしょ!」みたいなライブラリがあれば是非教えてください
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

最近のAndroid開発でよく使われているっぽいライブラリまとめ(2019/05)

私は去年から真面目にAndroid開発を始めたのですが、プロダクトの開発で息するように使われているライブラリなどは誰も教えてくれず知るまでなかなか時間がかかりました。この記事ではこれからAndroid開発を始める人向けに今よく使われているライブラリをまとめます。

「よく使われている」は完全に主観です。

AAC

Android Architecture Componentsの略で、Android Jetpackのコンポーネントの一つです

https://developer.android.com/jetpack?hl=JA

AACに含まれるライブラリの中でも特によく使うものについて紹介します。

Data Binding Library

https://developer.android.com/topic/libraries/data-binding/?hl=JA

文字通りデータバインディングに使うライブラリです。私はMVVMでの開発でよく使ってます。XMLにオブジェクトをバインドしたり、後述するLiveDataなどで双方向のデータバインディングもできるので大変便利です。

Lifecycle

https://developer.android.com/topic/libraries/architecture/lifecycle?hl=JA

ActivityやFragmentのライフサイクルを管理します。LifecycleObserverを使うとActivityやFragmentのライフサイクルイベントを他のクラスで監視することができるのでとても便利です。

LiveData

https://developer.android.com/topic/libraries/architecture/livedata?hl=JA

LiveDataはライフサイクルと連動して、値の変更を通知することができます。私はRxのSubjectを使ってレイヤー間の通知を行っていた部分をLiveDataに置き換えました。双方向のデータバインディングにも利用できて便利です。

Room

https://developer.android.com/topic/libraries/architecture/room?hl=JA

RoomではSQLiteをスムーズに使えるようなインターフェースを提供しています。私はそこまでがっつり使ってないのでなんとも言えません。

ViewModel

https://developer.android.com/topic/libraries/architecture/viewmodel?hl=JA

ViewModelはActivityやFragmentのライフサイクルと関連づけてUI関連のデータを管理することができます。いわゆるMVVMのViewModelとは文脈が少々異なる物だと思いますが、MVVMでのアプリケーション開発にはとても役立ちます。私はめちゃくちゃ使っています。

その他

  • WorkManager
    • ぶっちゃけ使ったことないので知りません
  • Navigation
    • 遷移周りを管理します。safeArgs(Fragment間でのデータ受け渡しに使えるモノ)が便利だった
  • Paging
    • ぶっちゃけ使ったことないので知りません

通信周り

okhttp + retrofit + RxJava(RxKotlin) + RxAndroid + moshi(gson) みたいな構成をよく見ます。 最近はcoroutineを使った非同期処理もよく見かけます。

HTTPクライアント

okhttp

https://github.com/square/okhttp

デファクトでしょう。私はこれが無いと生きていけないです。

retrofit2

https://github.com/square/retrofit

RESTをいい感じに扱えるライブラリ。okhttpと一緒に使うことが多し。

JSONパーサ

一昔前はJacksonが使われていたらしい?

gson

https://github.com/google/gson

google製です。よく見ます。私はDeserializerを自分で書かなきゃいけない時など複雑な要件の時に使ってます。

moshi

https://github.com/square/moshi

square製です。最近は専らこっちを使ってます。

kotshi

https://github.com/ansman/kotshi

kotlin実装です。kotlin向けのMoshiのadapter。

画像

glide

https://github.com/bumptech/glide

画像表示には欠かせない存在です。よく見ます。

picasso

https://github.com/square/picasso

こっちもよく見ます。体感的にはglideの方が使われてそう。

Rx

RxJava

https://github.com/ReactiveX/RxJava

リアクティブプログラミングというパラダイムのコード記述ができます。学習コストは高いですが覚えると大変便利です。非同期処理用のライブラリだと思われがち。最近は他の技術に置き換える流れを感じますがまだまだ色んなところで使われているし個人的にはこれが無いとかなり辛い。

RxKotlin

https://github.com/ReactiveX/RxKotlin

RxJavaのKotlin拡張です。KotlinでRxを使うならぜひ導入しましょう。

RxAndroid

https://github.com/ReactiveX/RxAndroid

Android開発におけるRxJavaでの非同期通信には欠かせない存在です。

RecyclerView

groupie

https://github.com/lisawray/groupie

最近人気すぎて怖い。でも確かに便利です。

epoxy

https://github.com/airbnb/epoxy

airbnb製。ぶっちゃけ使ったこと無いのでよくわかりませんが便利そう。MvRxや他のairbnb製のライブラリと相性が良さげです。

デバッグ関連

Log代替

timber

https://github.com/JakeWharton/timber

android.util.Logのラッパーです。誰も教えてくれないけどみんな使ってます(主観)。ビルドタイプによる機能の切り替えなどができます。

メモリ管理

leakcanary

https://github.com/square/leakcanary

信頼と実績のsquare製。アプリのメモリリークを検出し、通知します。当たり前のように使われている感じがします。

通信ログ周り

stetho

https://github.com/facebook/stetho

okhttpに噛ませるとChromeで通信ログなどが見れます。めちゃ便利。

flipper

https://github.com/facebook/flipper

Facebook製。Android以外のプラットフォームでも使えます。使ってる人見たことないです。stethoで良くね?

その他

Hyperion-Android

https://github.com/willowtreeapps/Hyperion-Android

色々できます。詳しくはこちらの記事を見てください。

DI

Dependency Injectionの略です。最近は知ってて当たり前感があります。参考

dagger2

https://github.com/google/dagger

square発google製。めちゃくちゃ使われてます。学習コストはかなり高いと思います。

koin

https://github.com/InsertKoinIO/koin

kotlin実装のDIライブラリ。知名度も上がってきて勢いを感じます。daggerよりわかりやすいので私は好きです。

テスト周り

mockito

https://github.com/mockito/mockito

モッキングフレームワークです。デファクト感があります。

mockk

https://github.com/mockk/mockk

kotlin実装のモッキングライブラリです。最近見かけるようになりました。

その他

ThreeTenABP

https://github.com/JakeWharton/ThreeTenABP

Androidで日付を簡単に扱えるライブラリ。誰も教えてくれないけど大変便利で使ってる人も多いはず。

所感

  • Java -> Kotlinの流れを強く感じます(koinとか)
  • 最近のAndroid開発ではdaggerやRxなど学習コストの高いものを覚える必要があり、開発を始める敷居が高くなっているように思います
  • 「これはみんな使ってるっしょ!」みたいなライブラリがあれば是非教えてください
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む