すわりんのブログ

androidとかサブカルとかのブログです

kotlinでrawStringを使う

kotlinです。

開発中にAPIは実装されていなけど、返すjsonのフォーマットは決まっている時に パースを試したい時などがあると思います。

そういう時はjsonをコード内で直接書いてパース出来るかテストしてたのですが ダブルクオーテーションのエスケープが面倒くさいし読みづらい!

val jsonTest = "{\"id\":1,\"name\":\"taro\"}"

そんな時はrawStringが使えます。 "を3回繰り返せば、その中で書いた文字列は全てエスケープ不要となり 生のtextとして扱えるのでエスケープの煩わさしさから開放されます。

val jsonText = """

{"id":1,"name":"taro"}

"""

エスケープ面倒くさいなーという時は思い出してあげて下さい。

RxObserverのテスト

RxJavaの話です

Rxでテストをする時はObservableがtestメソッドを持っているのでこの返却値を使います。

val test = Observable.fromArray(1, 2, 3, 4)
                .filter { it % 2 == 0 }
                .test()

testはTestObserverであり、自身にいくつかのassertionを持っているので UnitTest時に使うことで表明する事ができます。

//errorが発生しないことを表明
test.assertNoErrors()
//流れてきたイベント値の表明
test.assertValueAt(0) { it == 2 }
test.assertValueAt(1) { it == 4 }
//completeしていることを表明
test.assertComplete()

流れてくる値が1つだけなら test.assertValue((T) -> Boolean)も使うことが出来ます。

いつでも正しいコードと言えるように RxでもTestを書いていきましょう。

全体のコードです

 @Test
 fun filterOfEvalTest() {

        val test = Observable.fromArray(1, 2, 3, 4)
                .filter { it % 2 == 0 }
                .test()


        //errorが発生しないことを表明
        test.assertNoErrors()
        //流れてきたイベント値の表明
        test.assertValueAt(0) { it == 2 }
        test.assertValueAt(1) { it == 4 }
        //completeしていることを表明
        test.assertComplete()
}

viewをクリックした際の背景の設定

ButtonやListViewには初めからクリック時の背景が変化しますが そうでないViewに設定する場合。

一番簡単なのは以下のように
android:background="?attr/selectableItemBackground"
を付けてあげると変化してくれます。 さらに5.0以上ならちゃんとロングクリック時のフェードエフェクトも行ってくれます。 簡単だね!

<LinearLayout
            android:id="@+id/inviteAbout"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:background="?attr/selectableItemBackground"
>

[所要時間:5分]

xmlにプレフィックスを付ける

androidxmlで画面や背景・ボタンを定義するが 開発が進むと膨大な数になって管理コストが増えていく。 何か解決策ないかと探してると DroidoKaigiのアプリがプレフィックスを付けて管理していたので 取り入れた所ある程度改善できたように思えた。

どんな感じかというと

  • bg_xxx_xxx.xml
  • part_xxx_xxx.xml
  • btn_xxx_xxx.xml

のように名前をつける。 bgはbackgorund partはincludeするlayout btnはbutton

以前はxxx_background.xmlと名付けていたので 一覧性が犠牲になっていた。 プレフィックスがあれば使用用途毎に並ぶので、見つけやくてグッド。

余談だがAtomicDesignを取り入れられないか思案中。 勉強だー

[所要時間:8分]

VIPERについてダラダラ書く

現在AndroidをVIPERというアーキテクチャーで書いてます。 元々はiOSのもらしいけど合わせる形で採用しました。

iOS Project Architecture : Using VIPER [和訳] - Qiita

android:kotlin,iOS:swiftで書くわけですが 似てる部分もあると言われる2つの言語。 進めていく中で言語の差があることがわかりました。

kotlin swift
抽象化 interface protocol
static抽象化メソッド 持てない 持てる
抽象化に実装 持てる 持てない
enum毎に変数 持てない 持てる

もっとあるけれどVIPERでやる中で気になったのはこの辺り。

同一のアーキテクチャでも言語によって 書き方が結構変わったり、そもそも片方でしか実現できない事があったりして 乗り越える課題が多いですが、統一化出来れば保守性は上がるかもしれません。

所要時間:10分

プリンシプルオブプログラミングを読みました

一通り読み終えた。

800冊以上の技術書を読んだ著者による 身につけたい原理原則が書かれている本。 プログラミングする上でのエッセンスの詰め合わせのような本だった。

複数の本に同じことが書かれていれば それは真理として捉えて良いとレベレッジリーディングに書かれていたが まさにそれを体現したかのような内容だった。

要は様々な本に書かれている要点を纏めたようなもの。 要点故に深くまでは突っ込まないので 気になったら参考文献を読むと良いっぽい。

割りと実務に関する物も多いので 実際に働き始めて1年以上経つと 刺さる部分が多くなるんじゃなかろうか。

自分は読んでいて気になった箇所は折り曲げてマーキングしているが 全編通して折り曲がっているので役に立つ筈。 このあと纏めてみるのよ。

[所要時間:8分\

Spinnerの選択はDropDownとDialogがある

表題の通り。

layout.xmlでSpinnerのタグに spinnerModeを指定することで 選択方式をDialogとDropDownを切り替えることができる。

//Dialog

<android.support.v7.widget.AppCompatSpinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/spinner1"
    android:spinnerMode="dialog" />

//Spinner

<android.support.v7.widget.AppCompatSpinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/spinner2"
    android:spinnerMode="dropDown" />

AppCompatSpinnerのデフォルトはdropDownだが この記述で簡単にDialogに変更することができる。

ちなみにstyleをandroid:Widget.SpinnerにするとDialogになる。

過去のメモより抜粋