それがいいことの序章です

楽しいことならいっぱい夢見ることならめいっぱい

ioschedのToolbar周りを見てみた

iosched 2018が公開されましたね!知見たっぷり🎉
Tooblar`周りをどうしようか悩んでいたので抜粋。

BottomNavigationViewを使ったときのあれ。

ioschedではActivityToolbarを持つ形ではないようでした。個人的に先入観もありビックリ。

結論から言うと、FragmentAppBarLayoutを持たせる感じでした。 スケジュールタブの場合は

<AppBarLayout>
    <FrameLayout  app:layout_scrollFlags="scroll|snap|exitUntilCollapsed">
        <ImageView  android:layout_gravity="center_vertical|start"/>
        <TextView  android:textAppearance="@style/TextAppearance.IOSched.ToolbarTitle"/>
    </FrameLayout>
    <TabLayout/>
</AppBarLayout>

といった具合です。ガッツリImageViewTextViewも位置指定してました。

ちょっと気になってToolbarのUseageを探してみたところ、ファイルとしてはtoolbar.xmlはあるものの
これどこも使ってないように見受けられます(違ったら教えてほしい!)

UpNavigationが気になる。

ここで気になるのがスケジュール等の詳細のUpNavigation周りになってきます。
Toolbarではなく普通にImageViewでした。わお。

<ImageButton
    android:id="@+id/up"
    android:layout_width="?actionBarSize"
    android:layout_height="?actionBarSize"
    android:layout_gravity="start|top"
    android:background="?selectableItemBackgroundBorderless"
    android:contentDescription="@string/navigate_up"
    app:srcCompat="@drawable/ic_arrow_back" />

こんな具合です。知らなかった。。
スクロールに応じて見えなくなったりもしていたのでてっきりToolbarかと思ってました。
この挙動についてはPushUpScrollListenerで定義されているようです。

感想

Material studiesを見ていると、Toolbar周りの自由度がグッと上がった気がしていて
勝手にToolbarを拡張と考えていましたが、結構筋肉で実装していく感じになるのかな?

KotlinのSealedクラス使いたくて無理をした

Kotlinのsealed classを使いたいと虎視眈々だったんだけど
ついに突っ込んでみた。今回の用途ではそんなにメリットはないけど。
よくある成功or失敗を柔軟にという感じはなくemunの拡張くらいの気持ち。

使ったとこ

Firebase AnalyticsでUser Propertyを設定したかったんだけど、enum

enum class UserProperty(
    val propertyName: String,
    val value: String
) {

  AREA_KYUSYU("area", "九州),
  AREA_SHIKOKU("area", "四国),
    ...
}

とするのは毎回areaって書かなきゃなのがかっこ悪いなと。

おっ、と思ってsealed class使って見ると

sealed class UserProperty(
    val name: String,
    open val value: String
) {

  abstract class Area(override val value: String) : UserProperty("area", value)

  object Kyushu : Area("male")
  object Shikoku : Area("female")
    ...
}

って書けた。コレジャナイ感は否めないけど、こっちのほうが好みなので良しとしよう。

まとめ

もっと活用していこう。あとブログちゃんと書くぞ!(n回目)

KotlinでGsonでStringをBooleanにする

やったこと

AndroidでRetrofit + Gsonを使っているときのおはなし。
APIレスポンスにStringで"0"、"1"が返ってくる場面に出くわして
これをBooleanとして扱いたくってTypeAdapterを使ったよ。

なにが起きたか

{
    "is_success": "1"
}

みたいなやつをBooleanで扱うぞと思って

data class Response(
    @SerializedName("is_success")
    val isSuccess: Boolean
)

というふうにしてたら全部trueになった。全てが正になった困った。

どうやったか

パッと思いついたのはコンバータクラス作って

// レスポンスはStringで受ける
// data class Response(
//     @SerializedName("is_success")
//     val isSuccess: String
// )

object ResponseConverter {
  fun convert(res: Response) = Item(isSuccess = res.isSuccess == "1")
}

fun Response.convert() = ResponseConverter.convert(this)

みたいにするのだけど、毎回するのアレだよな〜と思って調べたら
TypeAdapterなるものを知った。詳しくは説明しないけど便利。

ということで

class IntToBooleanTypeAdapter : TypeAdapter<Boolean>() {
    override fun write(out: JsonWriter, value: Boolean?) {
        if (value == null) {
            out.nullValue()
            return
        }

        out.value(if (value) 1 else 0)
    }

    override fun read(`in`: JsonReader): Boolean {
        if (`in`.peek() == null) return false
        return `in`.nextInt() == 1
    }
}

というふうにしてあげて、レスポンスを

data class Response(
    @SerializedName("is_success") @JsonAdapter(IntToBooleanTypeAdapter::class)
    val isSuccess: Boolean
)

のようにしてあげることで、無事変換された!!

おわりに

Gsonがどのようにうまいこと変換してくれるかまで
調べるのに手が回ってないので時間ができたら調べる。

Gsonなのか、Kotlinの型の問題なのかわすれちゃった。。
Javaのときはできてたような…できてなかったような…

調べたら追記するかも。明日はDroidKaigi。

使わないパラメータでWarningを出さない for Kotlin

Androidの話。
MVVMアーキテクチャで開発をしていると、ViewModelにクリックメソッドを実装する事が多い。
その際、

fun onClickHoge(view: View) {
  someThing()
}

のように定義するんだけど、このviewというパラメータはそこまで使わない。

使わないパラメータで警告を出さないようにしようと

fun onClickHoge(@SuppressWarnings("unused") view: View) {
  someThing()
}

としてたんだけど、これでは警告が抑えられていなかった。

調べてみると、これはJavaの書き方のようで、Kotlinだと@Suppressを使うらしい。
そこで、

fun onClickHoge(@Suppress("unused") view: View) {
  someThing()
}

としたんだけど、これでも警告が抑えられていなかった。

調べてみると、unusedじゃなくてUNUSED_PARAMETERを使うらしい。 そこで、

fun onClickHoge(@Suppress("UNUSED_PARAMETER") view: View) {
  someThing()
}

とすると、警告が抑えられた!🙌

conclusion

困ったらalt + Enterだ 🙏 f:id:rmakiyama:20180126140801p:plain

DroidKaigi conference-app-2018にコントリビュートした

このブログをはじめるきっかけにもなったDroidKaigi 2017。
一番最初のブログで、こんなことを言ってた。

来年もまたあったら絶対にコントリビュートする!と心の中で誓う私。

DroidKaigi 2017 is awesoooome!!! - イニシャルがリムーブ

コントリビュートした💪

有言実行。簡単なissueを拾ってコントリビュートさせて頂いた。

github.com
このissueをこう。
github.com
やったぜ!

すごい :+1: の飛び交う雰囲気でとてもあたたかくて
PR出すまで緊張してたけどとっても嬉しかった!

もういっちょ

あとは見ていてコードでの知見もだがUI的にも参考になる。
ぜひとも見て触って欲しいと思う。集合知である。

触ってたら


なんて事もあって1行入れ替えのPRを出したら
爆速でマージしていただいてさらに良い経験になった!

github.com

英語が本当にひどいので頑張ろうと思った。
けど、こんな英語でも怒られることはない!(?)

やってみて所感

今回のコントリビュートで、OSSに関わるって
楽しいし夢があるし学びしかないと身を持って感じれたのが
1番の収穫だったと思う!機会があれば狙っていきたい!

今がチャンス

easyタグのissueが増えた今がチャンス!
ぜひこの体験をあなたも!あなたも!

github.com


P.S.
2週間に1記事が聞いて呆れるけど、気にせず続けていきます🙌